Pull to refresh

ASP.NET — кастомная авторизация формами. Шпаргалка

Reading time3 min
Views2K
Существует множество способов написать свою реализацию авторизации на сайте. Я приведу достаточно простой способ создания своего провайдера для авторизации и прописывания его в веб конфиге. Этот способ позволит использовать такие стандартные элементы управления как Login, LoginStatus и им подобные.

Свой MembershipProvider для аутентификации пользователя


Шаг 1: наследуемся от System.Web.Security.MembershipProvider, реализуем класс и переопределяем нужные нам методы. Основным из них является ValidateUser, который отвечает за аутентификацию пользователя в системе.
namespace Providers
{
  public class CustomMembershipProvider : MembershipProvider
  {
      public override bool ValidateUser(string username, string password)
    {
      return myUserManager.ValidateUser(username, password);//Ваша реализация аутентификации пользователя
    }
   ...
  }
}


Методы, которые не хочется переопределять можно оставить в таком виде:
public override bool UnlockUser(string userName)
{
   throw new Exception("The method or operation is not implemented.");
}


в случае надобности их всегда можно будет реализовать.

Шаг 2: в web.config прописывается:
<system.web>
  <membership defaultProvider="CustomMembershipProvider">
  <providers>
      <clear/>
    <add name="CustomMembershipProvider" type="Providers.CustomMembershipProvider"/>
  </providers>
  </membership>
</system.web>


Так же не стоит забывать о том, что нужно прописать что у нас делается авторизация формами:
<authentication mode="Forms">
   <forms defaultUrl="~/Default.aspx" timeout="120" loginUrl="~/Login.aspx" />
  </authentication>


Теперь можно кидать на страничку авторизации контрол Login и пользоваться им, не забывая про то, зачем вам нужна была авторизация:
  <authorization>
   <deny users="?" />
   <allow users="*" />
  </authorization>



Свой RoleProvider для определения ролей пользователя


Шаг 1: наследуемся от System.Web.Security.RoleProvider, реализуем класс и переопределяем нужные нам методы.
namespace Providers
{
  public class CustomRoleProvider : RoleProvider
  {
    public override string[] GetRolesForUser(string username)
    {
      return myUserManager.GetUser(username).Roles;//Ваша реализация выборки ролей по имени пользователя
    }
  }
}


Здесь так же неиспользуемые методы можно оставить кидающими эксепшн:
public override string[] GetUsersInRole(string roleName)
{
  throw new Exception("The method or operation is not implemented.");
}


Шаг 2: в web.config прописывается:
<system.web>
  <roleManager enabled="true" defaultProvider="CustomRoleProvider">
    <providers>
      <add name="CustomRoleProvider" type="Providers.CustomRoleProvider"/>
    </providers>
  </roleManager>
</system.web>


Все, можно пользоваться. Например вот так:
<authorization>
   <deny roles="Admin" />
</authorization>


И в качестве заключения приведу пример инъекции зависимостей в свои провайдеры с помощью Unity:
      if (Roles.Enabled)
        _unityContext.Container.BuildUp(Roles.Provider.GetType(), Roles.Provider);
      _unityContext.Container.BuildUp(Membership.Provider.GetType(), Membership.Provider);


* This source code was highlighted with Source Code Highlighter.
Tags:
Hubs:
Total votes 24: ↑18 and ↓6+12
Comments2

Articles