我已经定义了一个自己的ServiceCredentials提供者:
class PasswordServiceCredentials : ServiceCredentials
{
}
当我启动ServiceHost时,该提供程序会在CreateSecurityTokenManager()方法中生成自定义SecurityTokenManager:
public override SecurityTokenManager CreateSecurityTokenManager()
{
if (this.UserNameAuthentication.UserNamePasswordValidationMode == UserNamePasswordValidationMode.Custom)
{
return new PasswordSecurityTokenManager(this);
}
return base.CreateSecurityTokenManager();
}
PasswordSecurityTokenManager类:
class PasswordSecurityTokenManager : ServiceCredentialsSecurityTokenManager
{
}
该实例在CreateSecurityTokenAuthenticator()方法中生成自定义SecurityTokenAuthenticator :
public override SecurityTokenAuthenticator CreateSecurityTokenAuthenticator(SecurityTokenRequirement tokenRequirement, out SecurityTokenResolver outOfBandTokenResolver)
{
outOfBandTokenResolver = null;
return new PasswordSecurityTokenAuthenticator(this.ServiceCredentials
.UserNameAuthentication
.CustomUserNamePasswordValidator);
}
生成的实例是自定义CustomUserNameSecurityTokenAuthenticator。
问题是在任何时候都不会调用被覆盖的ValidateUserNamePasswordCore()方法:
protected override ReadOnlyCollection<IAuthorizationPolicy> ValidateUserNamePasswordCore(String userName, String password)
{
ReadOnlyCollection<IAuthorizationPolicy> currentPolicies = base.ValidateUserNamePasswordCore(userName, password);
List<IAuthorizationPolicy> newPolicies = new List<IAuthorizationPolicy>();
if (currentPolicies != null)
{
newPolicies.AddRange(currentPolicies.OfType<IAuthorizationPolicy>());
}
newPolicies.Add(new PasswordAuthorizationPolicy(userName, password));
return newPolicies.AsReadOnly();
}
在我的自定义IAuthorizationPolicy提供程序PasswordAuthorizationPolicy中,我想在Evaluate()方法中为EvaluationContext设置自定义主体。
但是如果不调用upper方法,就不能定义额外的IAuthorizationPolicy项。
这里有什么问题或遗漏?
我不使用 XML 来配置我的服务,我 100% 用 C# 代码来做这件事!
编辑:代码基于以下博客文章: http: //www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx