РЕДАКТИРОВАТЬ: Я думаю, что проблема может быть связана с проблемой ниже, так как я также использую SSL PrincipalPermission.Demand (), сбой после перемещения службы WCF в SSL
Я работаю над безопасным набором веб-служб, я реализовал CustomRoleProvider и CustomMembershipProvider для аутентификации пользователей.
Это прекрасно работает, однако я бы хотел ограничить доступ кБольшинство сервисных вызовов, если пользователь не аутентифицирован.
Я планировал использовать следующее для выполнения этого
[PrincipalPermission(SecurityAction.Demand, Authenticated=true)]
Однако, похоже, это не определяет, когда пользователь аутентифицирован ивсегда выдает исключение безопасности.Я не совсем уверен, что я сделал неправильно.
public class CustomMembershipProvider : MembershipProvider
{
public string UserType;
public override bool ValidateUser(string username, string password)
{
//Custom logic to work out if user exists and password is correct
//If the user exists and password matches we will get a populated user
//object containing their username and usertype
if (user == null)
{
return false;
}
else
{
return true;
}
}
}
В рамках моего вызова службы проверки подлинности я проверяю, возвращает ли поставщик членства значение true и устанавливает ли файл cookie проверки подлинности форм.
if (Membership.ValidateUser(username, password))
{
FormsAuthentication.SetAuthCookie(username, false);
}
Я настроил сервис авторизации в моей веб-конфигурации следующим образом:
<behavior name="SecureAuthServiceBehavior">
<serviceAuthorization principalPermissionMode="UseAspNetRoles" roleProviderName="CustomRoleProvider"/>
....
</behaviour>
Любая помощь будет принята с благодарностью, Спасибо
РЕДАКТИРОВАТЬ:
Я сделалнекоторое дальнейшее расследование проблемы и обнаружил, что Принципал устанавливается правильно.У меня есть следующий метод Service, в нем я получаю Принципал и проверяю, играет ли пользователь правильную роль, эффективно делая то, что делает тег в начале.
[PrincipalPermission(SecurityAction.Demand,Role="A" )]
public bool DoWork()
{
IPrincipal p = HttpContext.Current.User;
if (p.IsInRole("A"))
{
return true;
}
else
{
return false;
}
}
Этот метод в настоящее время выдает исключение SecurityExceptionоднако каждый раз, когда я закомментирую основное разрешение при запуске, метод работает и возвращает true.