4

カスタムを使用しているWCFサービスがありますServiceAuthorizationManager。カスタム認証マネージャーは、WindowsおよびForms認証を処理するように既に設定されています。

ただし、UserNameauthに設定されているクライアントに接続すると、ユーザー名がどこにも見つからないようです。

クライアントコードは次のようになります。

this.ClientCredentials.UserName.UserName = "user";
this.ClientCredentials.UserName.Password = "pass";
this.Open();
this.MyMethod(); // my actual contract method
this.Close();

次に、サーバー上にカスタム認証マネージャーがあります。

public sealed class AppAuthorizationManager : ServiceAuthorizationManager
{
    public override bool CheckAccess(OperationContext operationContext, ref Message message)
    {
        // would like to check user/pwd here...
    }
}

これは可能ですか?

  • 設定されThread.CurrentPrincipalていません、
  • operationContext.ServiceSecurityContext.PrimaryIdentity設定されていません。
  • operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets空です。

user / pwdはどこでも利用できるはずですか?または、カスタムも追加する必要がありUsernamePasswordValidatorますか?


更新:カスタムUserNamePasswordValidatorとを追加しましたIAuthorizationPolicy。更新されたWCF構成は次のようになります。

<behavior name="Server2ServerBehavior">
  <serviceMetadata httpGetEnabled="true" />
  <serviceDebug includeExceptionDetailInFaults="true" />
  <serviceAuthorization principalPermissionMode="Custom" serviceAuthorizationManagerType="MyApp.AuthManager, MyApp">
    <authorizationPolicies>
      <add policyType="MyApp.TokenAuthorizationPolicy, MyApp" />
    </authorizationPolicies>
  </serviceAuthorization>
  <serviceCredentials>
    <userNameAuthentication customUserNamePasswordValidatorType="MyApp.PFUserNameValidator, MyApp" />
  </serviceCredentials>
</behavior>

これらの3つのクラスすべてにブレークポイントを設定すると、WCFは例外をスローします。

LogonUser failed for the 'username' user. Ensure that the user has a valid Windows account.
   at System.IdentityModel.Selectors.WindowsUserNameSecurityTokenAuthenticator.ValidateUserNamePasswordCore(String userName, String password)

それらのいずれかが実行される前。うーん...

4

1 に答える 1