У меня было точно такое же требование. У меня была своя собственная схема пользователя и роли, и я не хотел переходить на схему членства asp.net, но я хотел использовать фильтры действий ASP.NET MVC для проверки авторизации и ролей. Я должен был изрядно покопаться, чтобы выяснить, что именно нужно сделать, но в конце концов это было относительно легко. Я избавлю тебя от неприятностей и расскажу, что я сделал.
1) Я создал класс, производный от System.Web.Security.MembershipProvider. MembershipProvider имеет массу абстрактных методов для всех видов функций, связанных с аутентификацией, таких как забытый пароль, смена пароля, создание нового пользователя и т. Д. Все, что мне нужно, - это возможность аутентификации по моей собственной схеме. Так что мой класс содержал в основном пустые переопределения. Я только что переопределил ValidateUser:
public override bool ValidateUser(string username, string password)
{
if (string.IsNullOrWhiteSpace(username) ||
string.IsNullOrWhiteSpace(password))
return false;
string hash = EncryptPassword(password);
User user = _repository.GetByUserName(username);
if (user == null) return false;
return user.Password == hash;
}
2) Я создал класс, производный от System.Web.Security.RoleProvider. Опять же, у меня были пустые реализации для всего того, что мне не нужно, например, создание и смена ролей. Я просто переопределил два метода:
public override string[] GetRolesForUser(string username)
{
User user = _repository.GetByUserName(username);
string[] roles = new string[user.Role.Rights.Count + 1];
roles[0] = user.Role.Description;
int idx = 0;
foreach (Right right in user.Role.Rights)
roles[++idx] = right.Description;
return roles;
}
public override bool IsUserInRole(string username, string roleName)
{
User user = _repository.GetByUserName(username);
if(user!=null)
return user.IsInRole(roleName);
else
return false;
}
3) Затем я подключил эти два класса в свой web.config:
<membership defaultProvider="FirstlookMemberProvider" userIsOnlineTimeWindow="15">
<providers>
<clear/>
<add name="FirstlookMemberProvider" type="FirstlookAdmin.DomainEntities.FirstlookMemberProvider, FirstlookAdmin" />
</providers>
</membership>
<roleManager defaultProvider="FirstlookRoleProvider" enabled="true" cacheRolesInCookie="true">
<providers>
<clear/>
<add name="FirstlookRoleProvider" type="FirstlookAdmin.DomainEntities.FirstlookRoleProvider, FirstlookAdmin" />
</providers>
</roleManager>
Вот и все. Фильтры действий авторизации по умолчанию будут использовать эти классы. Вам все равно придется обрабатывать страницу входа, входа и выхода. Просто используйте для этого стандартные классы проверки подлинности форм, как обычно.