Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
(Extended)MembershipProvider для нужд конкретного домена будет гораздо проще.NotImplementedException из ненужных?var provider = ((MyMembershipProvider)GetMembershipProvider());
provider.GetVipUsers();
public interface IIdentity
{
string AuthenticationType { get; }
bool IsAuthenticated { get; }
string Name { get; }
}
public interface IPrincipal
{
bool IsInRole(string role);
IIdentity Identity { get; }
}
public interface IAuthorizeService<in TAccount>
{
void SignIn(TAccount account, bool createPersistentCookie);
void SignOut();
}
Authorization
The first thing to identify is to what types of claims make sense for our fictitioushospital.com website. Lets think of claims as permissions that are required to access the features. If we consider patients as resources we may have (CRUD) permissions like Patient Create, Patient View, Patient Edit and Patient Delete. So the possible list of claims may be:
1. Patient Create
Right: schemas.xmlsoap.org/ws/2005/05/identity/right/possessproperty
Claim Type: schemas.fictitioushospital.com/2010/02/identity/claims/create
Resources: schemas.fictitioushospital.com/2010/02/identity/resources/patients
2. Patient View
Right: schemas.xmlsoap.org/ws/2005/05/identity/right/possessproperty
Claim Type: schemas.fictitioushospital.com/2010/02/identity/claims/read
Resources: schemas.fictitioushospital.com/2010/02/identity/resources/patients
3. Patient Edit
Right: schemas.xmlsoap.org/ws/2005/05/identity/right/possessproperty
Claim Type: schemas.fictitioushospital.com/2010/02/identity/claims/update
Resources: schemas.fictitioushospital.com/2010/02/identity/resources/patients
4. Patient Delete
Right: schemas.xmlsoap.org/ws/2005/05/identity/right/possessproperty
Claim Type: schemas.fictitioushospital.com/2010/02/identity/claims/delete
Resources: schemas.fictitioushospital.com/2010/02/identity/resources/patients
Во-вторых, вы спутали аутентификацию и авторизацию — это всё-таки разные вещи.
[ClaimsAuthorize(Action.Index, Resource.Project)]Итак, нашей целью будет написание настраиваемой (кастомной) аутентификации, с небольшой системой безопасности на основе ролей. Она не будет требовать изменения или дополнения модели предметной области приложения. Основное требование, это какой либо намек на пользователей и систему ролей. Стандартную систему безопасности, основанную на membership провайдерах, мы не будем рассматривать, и тем более использовать. Она мне кажется совсем не удобной. Основной ее минус заключается в необходимости конкретной схемы данных, которую зачастую сложно связать с предметной областью вашего приложения
MembershipProvider и RoleProvider вам просто было лень, иначе бы вы знали, что на схему данных ему полностью плевать.Authorize(Roles = ...), безо всяких прыжков и ужимок.В реализации подписанного метода декадируем cookie, создав и записав пользователя в текщий HTTP запрос.
Незабываем о unit-тестировании.
HttpContext.Current, FormsAuthentication)?protected AbstractController()
{
_user = new Lazy<TIdenty>(() => HttpContext.User.Identity as TIdenty);
}
Ага, после этого стоит пользователю завладеть нужной кукой, как отобрать у него роль станет невозможно, пока кука не протухнет. Очень смешно.
Про наличие у контроллера свойства ControllerContext вы, видимо, не в курсе?
еще любую ошибку, опечатку с предоставлением ролей можно обнаружить только в момент выполнения. Так как роли записаны в строковом формате.
Кто вам мешает добавить нужные правила? прим. Вытаскивам по id юзера, и проверяем его роли.
UserData, которая еще и не безгранична)?Так вроде при обращении через ContorollerContext.HttpContext достает тот же самый индивидуальный HTTP запрос?
Вы про константы не слышали?
Настраиваемая авторизация в Asp.Net MVC