【问题标题】:Require credentials for some methods only in WCF web service仅在 WCF Web 服务中需要某些方法的凭据
【发布时间】:2011-04-18 08:48:10
【问题描述】:

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

但是我似乎无法让它工作,所以只有一些方法需要身份验证。

需要认证的方法用

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

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

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

(我使用的是 basicHttpBinding)

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

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

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

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

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

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

谢谢!

【问题讨论】:

    标签: c# silverlight wcf web-services authentication


    【解决方案1】:

    安全设置可以在端点级别进行细化,但不能在合同中进行 - 因此您不能以您想要的方式组合安全和不安全的方法。我会建议

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

    【讨论】:

    • 感谢您的建议。另一种选择是创建一个用于不安全方法的特殊匿名用户帐户吗?或者这有什么缺点吗? (另外,很抱歉我在度假时回答迟了)
    • @aKzenT,它可以在 IIS 托管的 WCF 中使用传输级别凭据但不能使用消息凭据 - 问题是谁会将特殊帐户详细信息传递给 WCF,因为 IIS 只知道 HTTP 而不知道 WCF消息(是 HTTP 正文的一部分)。无论如何,一旦通过身份验证,您必须在服务方法中添加一些授权。
    猜你喜欢
    • 2013-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    相关资源
    最近更新 更多