Я искал по всему Интернету и ТАК, и я нашел несколько хороших материалов по этой теме, но у меня есть несколько вопросов, в которых я до сих пор не уверен:
1) Я использую проверку подлинности с помощью форм с настраиваемым поставщиком проверки подлинности. Поэтому я все еще использую атрибут Authorize
и раздел в web.config, но в основном, когда FormsAuthenticationTicket
не существует, я перенаправляю на страницу входа (указанную в web.config ), который затем использует настраиваемого поставщика аутентификации для аутентификации пользователя с помощью базы данных и затем выдает FormsAuthenticationTicket
. Это правильно?
2) Должен ли я использовать настраиваемый атрибут Authorize
или просто вставить GenericPrincipal
в HttpContext
из Application_AuthenticateRequest
обработчик событий на странице global.asax? Или мне следует использовать User.IsInRole
вместо действий контроллера?
Мне просто нужна авторизация на основе ролей, и я думаю, что моя схема аутентификации довольно хороша.
Любые указатели / советы?
Спасибо, Сэм
Редактировать
Итак, из того, что я прочитал, лучший вариант для этого - создать собственный 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
. Затем позвольте базе сделать все остальное.
Кажется, это нормально?
Edit # 2
Мне немного надоело использовать Application_AuthenticateRequest
в global.asax с IIS7 из-за встроенного конвейера, каждый запрос запускает это событие, изображения, css, js ...
Это правильно?