Пользовательская аутентификация / авторизация ASP.NET MVC 3

Я искал по всему Интернету и ТАК, и я нашел несколько хороших материалов по этой теме, но у меня есть несколько вопросов, в которых я до сих пор не уверен:

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 ...

Это правильно?

7
задан Sam 11 October 2011 в 18:34
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: