据我了解您的问题,您有一个 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 中提取用户名和密码,正如前面提到的文章中的一个 cmet 所建议的那样。
public void MyServiceMethod()
{
var context = OperationContext.Current;
var token = context.IncomingMessageProperties.Security
.IncomingSupportingTokens[0].SecurityToken as
System.IdentityModel.Tokens.UserNameSecurityToken;
//...
}