Я искал по всему Интернету и SO, и я нашел кое-что хорошее по этой теме, но у меня есть несколько вопросов, в которых я до сих пор не уверен:
1) Я использую проверку подлинности с помощью специального поставщика проверки подлинности. Поэтому я все еще использую атрибут Authorize
и раздел в web.config, но в основном, когда FormsAuthenticationTicket
не существует, я перенаправляю на страницу входа (указанную в web.config), которая затем использует пользовательский поставщик аутентификации для аутентификации пользователя по БД, а затем выдает FormsAuthenticationTicket
. Это правильно?
2) Должен ли я использовать собственный атрибут Authorize
или мне просто нужно вставить GenericPrincipal
в HttpContext
из обработчика событий Application_AuthenticateRequest
на странице global.asax? Или я должен использовать User.IsInRole
insode действий контроллера?
Мне просто нужна авторизация на основе ролей, и я думаю, что моя схема аутентификации довольно хороша.
Любые указатели / советы?
Спасибо,
Sam
Редактировать
Итак, из того, что я прочитал, лучший вариант для этого - создать пользовательский AuthorizeAttribute
и переопределить AuthorizeCore
.
Итак, что я сделал, это:
public class CustomAuthorize : System.Web.Mvc.AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext.User.Identity.IsAuthenticated)
{
var model = AdminUserViewModel.FromJsonString(((FormsIdentity)httpContext.User.Identity).Ticket.UserData);
httpContext.User = new GenericPrincipal(HttpContext.Current.User.Identity, model.SecurityGroups.Select(x => x.Name).ToArray());
}
return base.AuthorizeCore(httpContext);
}
protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
{
//base.HandleUnauthorizedRequest(filterContext);
filterContext.Result = new System.Web.Mvc.RedirectResult("/Authentication/NotAuthorized", false);
}
}
Просто введите новый принципал / идентификатор с ролями, которые хранятся в свойстве FormsAuthenticationTicket
UserData
. Тогда пусть база сделает все остальное.
Кажется, это нормально?
Редактировать # 2
Я немного устал от использования Application_AuthenticateRequest
в global.asax с IIS7, из-за интегрированного конвейера, каждый запрос запускает это событие, images, css, js ...
Это правильно?