仅在WCF Web服务中需要某些方法的凭据

时间:2011-04-18 08:48:10

标签: c# silverlight wcf web-services authentication

我有一个UserAccountService,它有不同的方法,其中一些需要用户进行身份验证(例如ChangePassword,ChangeUserData),而另一些则不需要(RegisterUser)。

然而,似乎我似乎无法让它工作,因此只有一些方法需要身份验证。

需要身份验证的方法用

修饰
[PrincipalPermission(SecurityAction.Demand, Authenticated = true)]

在我的app.config中,我指定了一个使用加密并请求UserName凭据的绑定:

    <binding name="authenticatedBinding">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
      </security>
    </binding>

(我正在使用basicHttpBinding)

我还配置了自定义身份验证提供程序:

      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" customUserNamePasswordValidatorType="..." />
      </serviceCredentials>

使用此配置,我似乎无法在未经过身份验证的情况下调用服务上的任何方法。

如果我省略安全配置,那么我可以调用不需要身份验证的方法,但不再传输邮件凭据。

如何配置我的服务,以便它允许调用所有方法,并且只需要在PrincipalPermission需要时设置用户名/密码?

我使用Silverlight作为我的客户,如果这很重要......

谢谢!

1 个答案:

答案 0 :(得分:3)

安全设置可以在终点级别进行细粒度处理,但不能在合同范围内进行细化 - 因此您无法将安全性和安全性结合起来。以你想要的方式不安全的方法。我会建议

  1. 您将服务合同(接口)分为两部分 - 一部分用于不安全的方法。第二个将从不安全的部分继承,并将包含需要保护的操作。
  2. 您的服务实现不需要改变(因为它应该实现安全接口) - 您需要做的就是在两个不同的端点将此实现公开为两个不同的合同(在安全和另一个不安全的情况下)。您需要使用安全合同锁定端点,并使用所需的任何安全配置。
  3. 不幸的是,从客户的角度来看,您必须在身份验证边界切换端点/ URL,即在用户通过身份验证之前,您可以使用不安全的端点,但只需经过身份验证,客户端就可以使用任何端点。