3

独自の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

4

1 に答える 1