WCF Web服务需要访问用户名和密码信息

时间:2011-12-19 17:54:46

标签: wcf service passwords web username

我构建了一个wcf Web服务,它只是向CRM托管的Silverlight应用程序提供MS Dynamics SQL数据。目前,Web服务托管在IIS中,并且只能通过HTTPS使用,因此消息的内容是安全的。我现在准备实现与谁登录Silverlight客户端应用程序有关的下一级安全性。我想将该信息传递给Web服务,然后在创建SQL Server Connection对象时使用它。结果将是MS Dynamics数据库将仅返回已连接用户有权查看的数据。

此模型与标准模型不同,后者包括对给定用户进行身份验证以访问Web服务。相反,在我的模型中,每个人都被授予访问Web服务的权限,SQL查询的结果基于给定用户的用户名和密码。

澄清: Silverlight应用程序在用户登录应用程序时会收集用户名和密码。当Web服务连接到SQL Server数据库时,这是Web服务最终需要使用的信息。因此,我的目标是让Silverlight应用程序将用户名和密码传递给Web服务,以便Web服务可以检索它并在创建Connection对象时使用它。

我正在考虑像为每个Web服务请求添加用户名和密码一样简单的事情。但是,我宁愿能够使用标准方法传递用户凭据,但我似乎找不到任何方法来获取密码。用户名可通过OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name访问。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用wsHttpBinding将凭据传递到您的服务,但这至少要求您发送带有邮件安全性的凭据。您可以将其与IIS中的匿名身份验证结合使用。这样,每个人都可以在传输级别访问该服务,但您将能够自己处理凭据。

要扩展,我在IIS中使用HTTPS和匿名身份验证运行WCF服务。在我的web.config中,我设置了一个wsHttpBinding,如下所示:

<bindings>
<wsHttpBinding>
    <binding name="CredentialsBinding" />
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" algorithmSuite="Default" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>

在我的行为中,我为自定义用户名/密码验证器设置了servicebehavior,如下所示:

<behaviors>
  <serviceBehaviors>
    <behavior name="DefaultBehavior">
      <serviceCredentials>
        <userNameAuthentication
        userNamePasswordValidationMode="Custom"
       customUserNamePasswordValidatorType="MyNamespace.CredentialValidator, MyNamespace"/>
      </serviceCredentials>
       </behavior>
  </serviceBehaviors>
</behaviors>

验证器如下所示:

namespace MyNamespace.CredentialValidator
{
    public class CredentialValidator:  UserNamePasswordValidator 
    {
        public override void Validate(string userName, string password)
        {
            // you can now handle the username and password passed to your service
            // with a wsHttpBinding through HTTPS
        }
    }
}

- 编辑

Rory Primrose在他的文章WCF Security: Getting the password of the user中描述了您可能正在寻找的内容,使用CustomUserNameSecurityTokenAuthenticator获取密码以供进一步使用。