カスタムを使用しているWCFサービスがありますServiceAuthorizationManager
。カスタム認証マネージャーは、WindowsおよびForms認証を処理するように既に設定されています。
ただし、UserName
authに設定されているクライアントに接続すると、ユーザー名がどこにも見つからないようです。
クライアントコードは次のようになります。
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)
それらのいずれかが実行される前。うーん...