独自の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を使用してサービスを構成することはありません。これはC#コードで100%実行します。
編集:コードは次のブログ記事に基づいています:http://www.neovolve.com/post/2008/04/07/wcf-security-getting-the-password-of-the-user.aspx