Управление ролями без провайдера? - PullRequest
3 голосов
/ 11 мая 2011

В моем приложении мне нужно проверить роли для пользователя loggind, чтобы определить, может ли пользователь видеть некоторые элементы управления или нет

сначала я использую шаблон loginview от MS, но поскольку у меня нет пользователей db, ни роли db Поэтому я не мог добавить поставщика ролей, поэтому я не мог использовать класс Role для проверки users \ role

Как и в моем случае, у меня есть сеанс с информацией о пользователе и ролями, которые у него есть, и мне нужно выполнить проверку этих ролей, чтобы установить, какой элемент управления будет включен для пользователя, но стандартным способом, используя встроенный класс .net. или код "

Ответы [ 2 ]

7 голосов
/ 11 мая 2011

Если вы хотите использовать части сервисов членства / аутентификации / авторизации 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; в коде вашего провайдера.

4 голосов
/ 11 мая 2011

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

Заполните два метода ниже, используя свою собственную логику:

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>

(замена значений по названию)

...