У меня есть служба 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
пусто.
Предполагается, что пользователь / 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>
Если я установлю точку останова во всех этих трех классах, 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)
До того, как какой-либо из них будет запущен. Ммм ...