Как установить текст типа роли в.Net Role Provider?

В моем UserController.Login действия, я пытаюсь AddUserToRole() для аутентифицированного пользователя со значением одного из MembershipType.MembershipName свойство навигации:

Roles.AddUserToRole(thisUser.UserName, thisUser.MembershipType.MembershipName);

Я не использую раздутые автоматически сгенерированные типы членства и просто хочу добавить текстовое значение к роли пользователя, а не к диапазону ролей. Пользователь -> одна роль.

Пытаясь понять это, я определил пользовательский поставщик ролей в web.config:

<roleManager enabled="true" defaultProvider="CustomRoleProvider">
  <providers>
    <clear/>
    <add name="CustomRoleProvider" 
       type="MyWebsite.CustomRoleProvider, 
             CustomMembershipEF, Version=1.0.0.0, Culture=neutral" 
       connectionStringName="MyDbContext"
       enablePasswordRetrieval="false" enablePasswordReset="true" 
       requiresQuestionAndAnswer="false" writeExceptionsToEventLog="false" />
  </providers>
</roleManager>   

Поэтому вызов Roles.AddUserToRole() вызывает метод моего пользовательского провайдера, но я не уверен, что делать с этим методом.

Раньше я просто добавила enabled="true" к rolemanager раздел в web.config, но получаю следующую ошибку:

Не удалось найти запрошенный поставщик данных.Net Framework. Это не может быть установлено.

Вот мой поставщик пользовательских ролей (хотя я не знаю, зачем мне это нужно, так как я просто хочу добавить имя роли):

public class CustomRoleProvider : RoleProvider
{
    public override bool IsUserInRole(string username, string roleName)
    {
        using (var db = new MyApp.DAL.MyAppDbContext())
        {
            var user = db.Users.SingleOrDefault(u => u.UserName == username);
            if (user == null)
                return false;

            if (user.MembershipType != null && user.MembershipType.MembershipName == roleName)
            {
                return true;
            }
        }
        return false;
    }

    public override string[] GetRolesForUser(string username)
    {
        using (var db = new MyApp.DAL.MyAppDbContext())
        {
            var user = db.Users.SingleOrDefault(u => u.UserName == username);
            if (user == null)
                return new string[] { };

            return db.MembershipTypes == null ? new string[] { } :
              db.MembershipTypes.Select(u => u.MembershipName).ToArray();
        }
    }

    // -- Snip --

    public override string[] GetAllRoles()
    {
        using (var db = new MyApp.DAL.MyAppDbContext())
        {
            return db.MembershipTypes.Select(r => r.MembershipName).ToArray();
        }
    }

    // -- Snip --

    public override void AddUsersToRoles(string[] usernames, string[] roleNames)
    {
        throw new NotImplementedException();
    }

Я думаю, что это должно быть довольно просто сделать - просто установите имя роли пользователя... помощь приветствуется.

-- Обновить --

Я закомментировал содержание кастома AddUserToRole() метод, и пользователь может войти в систему. Однако при вызове метода действия проверка роли не выполнялась, т.е. должен был потерпеть неудачу, так как имя роли на самом деле не существует:

    [HttpGet]
    [AllowAnonymous]
    [Authorize(Roles="WaitConfirmationxxx")]
    public ActionResult WaitConfirmation()
    {

Я также заметил, что IsInRole() называется обычай GetRolesForUser() метод, который делает вызов БД в нем. Не совсем оптимально, и интересно, так ли это на самом деле?

                if(User.IsInRole("WaitConfirmation"))
                {
                    // email address has not yet been confirmed
                    return RedirectToAction("WaitConfirmation", "User");
                }

-- Обновить --

Моя ошибка здесь заключалась в том, что мне нужно было использовать Roles.AddUserToRole() (если кто-то не комментирует иначе).

Я также добавил cacheRolesInCookie параметр в roleManager определение в web.config:

<roleManager enabled="true" defaultProvider="CustomRoleProvider" cacheRolesInCookie="true">

Так что теперь, когда я звоню if(User.IsInRole("WaitConfirmation"))мой обычай GetRolesForUser(string username) называется.

Проблема в том, что ни один из Authorization Атрибуты работают. Предложения?

1 ответ

Решение

Вы должны удалить [AllowAnonymous] атрибут, измените его на это:

[HttpGet]
[Authorize(Roles="WaitConfirmationxxx")]
public ActionResult WaitConfirmation()
{

Если ваш RoleProvider настроен правильно, он должен использовать этот метод при попытке авторизации с помощью атрибута вышеупомянутого метода.

public override string[] GetRolesForUser(string username)
        {
Другие вопросы по тегам