ASP.NET MVC 3 Custom аутентификация / авторизация - PullRequest
7 голосов
/ 10 октября 2011

Я искал по всему Интернету и 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 ...

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

1 Ответ

4 голосов
/ 11 октября 2011

1) Я делаю то же самое.

2) Я использую атрибут Authorize и обработчик события Application_AuthenticateRequest.

В обработчике события Application_AuthenticateRequest я делаю что-то подобное:

    string[] roles = authenticationTicket.UserData.Split(',');

    if (Context.User != null)
        Context.User = new GenericPrincipal(Context.User.Identity, roles);

И на уровне контроллера или действия я делаю что-то вроде этого:

    [Authorize(Roles = "Admin, SuperAdmin")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...