Управление ролями без поставщика?

В моем приложении мне нужно проверить роли для пользователя 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>

(замена значений в соответствии с их именем)

Другие вопросы по тегам