Управление ролями без поставщика?
В моем приложении мне нужно проверить роли для пользователя loggind, чтобы определить, может ли пользователь видеть некоторые элементы управления или нет
сначала я использую шаблон имени для входа в систему от MS, но так как у меня нет пользователей db и db role, я не смог добавить поставщика ролей и не смог использовать класс Role для проверки users \ role
Как и в моем случае, у меня есть сеанс с информацией о пользователе и ролями, которые у него есть, и мне нужно выполнить проверку этих ролей, чтобы определить, какой элемент управления будет включен для пользователя, но стандартным способом "с использованием встроенного в класс или код.net".
2 ответа
Если вы хотите использовать части сервисов членства / аутентификации / авторизации asp.net, вам потребуется реализовать пользовательский поставщик ролей для проверки членства в ролях.
Первое, что нужно сделать, это создать класс, который наследует от System.Web.Security.RoleProvider
, в котором это звучит как методы, которые вы изначально будете заботиться о реализации:
- FindUsersInRole
- GetRolesForUser
- GetUsersInRole
- IsUserInRole
Итак, вы получите что-то похожее на:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
public class MyCustomRoleProvider : RoleProvider
{
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
}
public override string[] GetRolesForUser(string username)
{
}
public override string[] GetUsersInRole(string roleName)
{
}
public override bool IsUserInRole(string username, string roleName)
{
return GetUsersInRole(roleName).Contains(username);
}
}
Примечание: Visual Studio покажет много методов, таких как GetAllRoles
с throws new NotImplementedException()
, но я написал "минимальный" поставщик роли ранее и нужен только для реализации методов, перечисленных выше. Это было для ролей "только для чтения", где веб-приложение не обновляло их.
Затем вам нужно будет добавить roleManager
элемент к вашему web.config
файл под system.web
следующее:
<roleManager defaultProvider="NameOfYourRoleProvider" enabled="true">
<providers>
<clear />
<add name="NameOfYourRoleProvider" type="Namespace.To.Your.Class.And.Class.Name, Name.Of.Assembly.Containing.Your.RoleProvider" />
</providers>
</roleManager>
Следует иметь в виду, что RoleProvider
Экземпляр создается базовой инфраструктурой asp.net, поэтому вам нужно получить доступ к данным сеанса, пройдя через HttpContext.Current.Session
(и проверяя, что HttpContext.Current
не является нулевым до его использования), что потребует using System.Web;
в коде для вашего провайдера.
Ваш вопрос не слишком ясен, но если вы хотите предоставить свою собственную логику для решения, к каким ролям принадлежит пользователь, то вы можете сделать это следующим образом:
Заполните два метода ниже, используя свою собственную логику:
public class MyRoleProvider : System.Web.Security.RoleProvider
{
public override string[] GetRolesForUser(string username)
{
// check a database or an xml file etc.
}
public override bool IsUserInRole(string username, string roleName)
{
// check a database or an xml file etc.
}
}
Затем добавьте следующее в ваш web.config:
<roleManager enabled="true" defaultProvider="MyRoleProvider">
<providers>
<clear />
<add name="MyRoleProvider" type="MyNameSpace.MyRoleProvider, MyProjectOrAssemblyName" />
</providers>
</roleManager>
(замена значений в соответствии с их именем)