Существует множество способов написать свою реализацию авторизации на сайте. Я приведу достаточно простой способ создания своего провайдера для авторизации и прописывания его в веб конфиге. Этот способ позволит использовать такие стандартные элементы управления как Login, LoginStatus и им подобные.
Шаг 1: наследуемся от System.Web.Security.MembershipProvider, реализуем класс и переопределяем нужные нам методы. Основным из них является ValidateUser, который отвечает за аутентификацию пользователя в системе.
Методы, которые не хочется переопределять можно оставить в таком виде:
в случае надобности их всегда можно будет реализовать.
Шаг 2: в web.config прописывается:
Так же не стоит забывать о том, что нужно прописать что у нас делается авторизация формами:
Теперь можно кидать на страничку авторизации контрол Login и пользоваться им, не забывая про то, зачем вам нужна была авторизация:
Шаг 1: наследуемся от System.Web.Security.RoleProvider, реализуем класс и переопределяем нужные нам методы.
Здесь так же неиспользуемые методы можно оставить кидающими эксепшн:
Шаг 2: в web.config прописывается:
Все, можно пользоваться. Например вот так:
И в качестве заключения приведу пример инъекции зависимостей в свои провайдеры с помощью Unity:
Свой 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.