Проблемы с IsInRole - customRoleProvider - PullRequest
2 голосов
/ 08 марта 2011

В выходные я реализовал собственный RoleProvider с пользовательской аутентификацией. Используя бизнес-шаблон Silverlight, я смог добавить атрибут [RequRole ("Admin")] в запрос на обслуживание:

[RequiresRole("Admin")]
public IQueryable<P_BUDGET> GetBudgets()
{
    return this.ObjectContext.P_BUDGET;
}

Это сработало как шарм. Я использовал следующий код

Затем я зашел в библиотеку авторизации Кайла Макклеллана. Если в моем XAML (s: Authorization.RequiresRole = "Admin") установить атрибут "requireRole" в HyperlinkButton, он успешно скрывает кнопку при загрузке приложения. Когда я вошел в систему, я ожидал, что он определит роль «Администратор», в которой находится мой тестовый пользователь, в конечном итоге изменив видимость этого HLB на true. Однако, когда я перехожу через код, я попадаю в файл App.Web.g.cs, и у него есть эта функция:

public bool IsInRole(string role)
    {
        if ((this.Roles == null))
        {
            return false;
        }
        return global::System.Linq.Enumerable.Contains(this.Roles, role);
    }

В приведенном выше коде this.Roles имеет значение null. Что мне здесь не хватает? Первый блок кода использует метод «GetRolesForUser», который я переопределил, и возвращает список ролей из представления, которое у меня есть в моей БД. Второй использовал IsInRole, который я прочитал не то, что вы должны изменить.

Ваша помощь приветствуется!

Ответы [ 4 ]

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

Ваш пользовательский поставщик ролей должен нести ответственность за создание списка ролей из вашей базы данных или проверку наличия пользователя в роли с помощью вызова базы данных

Взгляните на этот пример кода от Microsoft: http://msdn.microsoft.com/en-us/library/system.web.security.roleprovider.isuserinrole.aspx

0 голосов
/ 08 марта 2011

Спасибо за ответы, ребята, но я нашел решение здесь с помощью комментария Кайла Макклеллана в его собственном ответе.Я уже переопределял GetAuthenticatedUser, часть которого включала получение моих ролей из БД.Проще говоря, мне пришлось поместить user.Roles = role, где role - это список ролей, возвращенных из моего представления БД.

0 голосов
/ 08 марта 2011

Roles в этом случае является свойством класса UserBase, унаследованного классом User, определенным в поддерживаемом веб-проекте (папка Models/User)По умолчанию при этом используется механизм проверки подлинности с помощью форм, а данные о пользователях, профилях, «ролях» и т. Д. Хранятся в локальной базе данных (в папке App_Data).Чтобы это работало, я рекомендую переопределить это свойство, чтобы оно возвращало нужные вам роли, и вам также следует настроить проверку подлинности с помощью форм для использования ваших собственных пользовательских данных.

0 голосов
/ 08 марта 2011

Я реализовал свой поставщик ролей custon, вам нужно создать роли в методе global.asax, int Application_Start.У меня что-то вроде этого:

void Application_Start(object sender, EventArgs e) 
{
    Roles.ApplicationName = "MyAppName";

    if (!Roles.RoleExists("admin"))
        Roles.CreateRole("admin");

    if (!Roles.RoleExists("operator"))
        Roles.CreateRole("operator");

    if (!Roles.RoleExists("user"))
        Roles.CreateRole("user");
}

Удачи.

...