Возникла проблема с атрибутом requireRole службы домена RIA - PullRequest
1 голос
/ 08 марта 2011

Мой вопрос похож на этот вопрос . Я надеюсь, что смогу предоставить более подробную информацию и контекст, чтобы ответить на них.

Итак, вот некоторый контекст: у меня есть простое внутреннее приложение 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;
    }

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Разобрался.По крайней мере, 2 вещи не так.Первый ключ найден здесь .Вторая подсказка здесь

1. Получается, мне действительно нужно написать собственный поставщик ролей.Необходимо только реализовать GetRolesForUser.

public override string[] GetRolesForUser(string username) {
   return new string[] { _userService.GetRolesFor(username) };
}    

2.Настройка настраиваемого поставщика ролей правильно в файле web.config

<roleManager cacheRolesInCookie="true" enabled="true" defaultProvider="MyRoleProvider">
    <providers>
      <add name="MyRoleProvider" type="MyProject.Web.Providers.MyRoleProvider, MyProject.Web"/>
    </providers>
</roleManager>
0 голосов
/ 26 февраля 2013

Я решил эту проблему, используя локальное хранилище учетных данных для кэширования учетных данных. Всякий раз, когда локальная проверка кредитоспособности не проходит, происходит внешняя проверка, и кэш заполняется / обновляется. Это было тривиальное переопределение метода ValidateUser. Это означает, что устаревшие пароли продолжают работать до тех пор, пока не будет использован обновленный пароль (он не будет работать локально, пройдет удаленно и вызовет обновление).

Этот подход означал, что внутренне все работало в соответствии с готовой конфигурацией без необходимости использования каких-либо других модов (кроме удаления локальных ссылок создания пользователя).

...