Мой вопрос похож на этот вопрос . Я надеюсь, что смогу предоставить более подробную информацию и контекст, чтобы ответить на них.
Итак, вот некоторый контекст: у меня есть простое внутреннее приложение silverlight (ver 4) со службами WCF Ria, которое я создаю для нашей небольшой группы поддержки. Он использует аутентификацию по сторонней базе данных, но вся другая информация пользователя, например, FriendlyName и Roles (только 1 роль на пользователя) взяты из нашей собственной базы данных. Я пытаюсь сделать это простым и не хочу реализовывать пользовательское членство и поставщиков ролей.
У меня есть несколько операций службы домена, которые я хочу ограничить определенными ролями, поэтому я попытался использовать атрибут RequiresRole
следующим образом:
[RequiresRole("Admin", "HelpDesk", "Billing" )]
public RisStudyInfo GetStudyInfo(string accession) {
return ris.GetStudyInfo(accession);
}
На стороне клиента WebContext.Current.User.IsInRole("Admin")
возвращает true, но я всегда получаю отказ в доступе при вызове службы. Атрибут RequiresAuthentication
работает как положено.
Ниже приведена реализация моего AuthenticationService
. Класс User
просто наследуется от UserBase
и добавляет свойство FriendlyName. Есть идеи, что я делаю не так?
[EnableClientAccess]
public class AuthenticationService : AuthenticationBase<User> {
UserDataService userData = new UserDataService();
protected override bool ValidateUser(string userName, string password) {
var auth = new DatabaseAuthenticator();
return auth.Authenticate(userName, password);
}
protected override User GetAuthenticatedUser(IPrincipal principal) {
User user = null;
if (principal.Identity.IsAuthenticated) {
user = new User();
user.FriendlyName = userData.GetFriendlyName(principal.Identity.Name);
user.Name = principal.Identity.Name;
user.Roles = GetRolesFor(user.Name);
}
return user;
}
private IEnumerable<string> GetRolesFor(string username) {
IList<string> roles = new List<string>();
string role = userData.GetRolesFor(username);
if (role != null)
roles.Add(role);
return roles;
}