我有一个安全模式设置为message的WCF服务。我使用Username作为客户端凭据类型,并使用自定义UserNamePasswordValidator。
NetTcpBinding binding = new NetTcpBinding(SecurityMode.Message, false);
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
用户通过身份验证后,是否可以在服务器端检索密码? 密码是否保存在请求的MessageHeader中?我可以从MessageHeader获取它(在用户通过身份验证后)吗?
安吉拉
答案 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;
//...
}