WCF - 从MessageHeader获取密码

时间:2011-09-14 10:15:20

标签: wcf security

我有一个安全模式设置为message的WCF服务。我使用Username作为客户端凭据类型,并使用自定义UserNamePasswordValidator。

 NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message, false);
 binding.Security.Mode = SecurityMode.Message;
 binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;

用户通过身份验证后,是否可以在服务器端检索密码? 密码是否保存在请求的MessageHeader中?我可以从MessageHeader获取它(在用户通过身份验证后)吗?

安吉拉

1 个答案:

答案 0 :(得分:3)

据我了解您的问题,您有一个WCF服务,需要用户名和密码进行身份验证。您已为此目的配置了自定义UserNamePasswordValidator,而不是依赖于WCF(= Windows)使用的默认机制。

请点击此处了解有关如何在WCF中设置自定义用户名和密码验证程序的更多信息:

http://msdn.microsoft.com/en-us/library/aa702565.aspx

我假设您已经创建了一个来自UserNamePasswordValidator类型的类。您的自定义类型负责检查包含用户列表的商店(数据库,xml文件等)的用户名和密码。验证者必须确定它是否正在处理有效用户。如果是这样,它可以验证用户。

例如:

public class CustomUserNameValidator : UserNamePasswordValidator
{
    public override void Validate(string userName, string password)
    {
        if (null == userName || null == password)
        {
            throw new ArgumentNullException();
        }

        // Validator username and password here
        // bool isValid = ...;

        if (!isValid)
        {
            throw new SecurityTokenException("Access denied.");
        }
    }
}

正如您所看到的,如果您正确实现了自定义UserNamePasswordValidator,您已经拥有了一个可以访问客户提交的用户名和密码的地方。

如果您想在用户通过身份验证后访问用户名,例如在服务方法之一的正文中,您可以使用以下内容:

var userName = 
    OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name;

请查看ServiceSecurityContext type了解详情。

如果您还想提供密码,我建议您查看以下文章:

http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx

我猜你也可以从当前的OperationContext中提取用户名和密码作为前面提到的文章中的一条评论。

public void MyServiceMethod()
{
    var context = OperationContext.Current;
    var token = context.IncomingMessageProperties.Security
                       .IncomingSupportingTokens[0].SecurityToken as  
                System.IdentityModel.Tokens.UserNameSecurityToken; 
    //...
}