Как установить текст типа роли в.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)
{