атрибут просит, чтобы пользователь вошел в систему вместо доступа запрещен?

Обновленный: Благодаря справке здесь я создал следующее решение:

public class CustomAuthorize : AuthorizeAttribute
{
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        // Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs
        // If user is not logged in prompt
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
        // Otherwise deny access
        else
        {
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {
                {"controller", "Account"},
                {"action", "NotAuthorized"}
            });
        }
    }
}

Я запустил с NerdDinner и использую FormsAuthentication с ActiveDirectory как мой поставщик членства. Я добавил поддержку ролей через мой дб с Global.asax & AccountController (ниже).

Таким образом, теперь в моем контроллере у меня есть мой Авторизовывать набор атрибута к ролям администратора только (ниже). Мой зарегистрированный пользователь является автором. То, когда я нажимаю, удаляют его, просит, чтобы я вошел в систему даже при том, что я уже сделал так. Куда я могу поместить логику для возврата представления доступа запрещен?

Global.asax.cs

    protected void Application_AuthenticateRequest(Object sender, EventArgs e)
    {
        HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
        if (authCookie == null || authCookie.Value == "")
        {
            return;
        }

        FormsAuthenticationTicket authTicket = null;

        try
        {
            authTicket = FormsAuthentication.Decrypt(authCookie.Value);
        }
        catch
        {
            return;
        }

        if (Context.User != null)
        {
            string[] roles = authTicket.UserData.Split(new char[] { ';' });
            Context.User = new GenericPrincipal(Context.User.Identity, roles);
        }
    }

AccountController.cs

    [HttpPost]
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
        Justification = "Needs to take same parameter type as Controller.Redirect()")]
    public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    {

        if (!ValidateLogOn(userName, password))
        {
            ViewData["rememberMe"] = rememberMe;
            return View();
        }

        // Make sure we have the username with the right capitalization
        // since we do case sensitive checks for OpenID Claimed Identifiers later.
        userName = this.MembershipService.GetCanonicalUsername(userName);

        // Lookup user's (CWID) appropriate access level
        string accessLevel = userRepository.FindUserByUserName(userName).AccessLevel.LevelName;

        FormsAuthenticationTicket authTicket = new
                        FormsAuthenticationTicket(1, //version
                        userName, // user name
                        DateTime.Now,             //creation
                        DateTime.Now.AddMinutes(30), //Expiration
                        rememberMe, //Persistent
                        accessLevel); // hacked to use roles instead

        string encTicket = FormsAuthentication.Encrypt(authTicket);
        this.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));

        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }

SpotlightController.cs

    [Authorize(Roles="Admin")]
    public ActionResult Delete(int id)
7
задан ryan 30 July 2010 в 18:41
поделиться

3 ответа

Вот что делает атрибут AuthorizeAttribute в готовом виде: Он проверяет, авторизован ли текущий пользователь для текущего запроса, и возвращает HHTP 401/UNAUTHORIZED, если он не авторизован, либо потому что он вообще не вошел в систему, либо потому что его нет в списке авторизованных пользователей/ролей для текущего запроса.

HTTP-модуль аутентификации веб-форм видит этот 401 ответ, перехватывает его и превращает в HTTP 302 (перенаправление) ответ на страницу входа, если атрибут loginUrl настроен в web.config. Общая идея заключается в том, что если пользователю отказано в доступе к сайту, потому что он не вошел в систему, то следующее, что он захочет сделать, это войти в систему.

Поскольку вы хотите сделать перенаправление в другое место, предложение Хэла переопределить HandleUnauthorizedRequest и сделать перенаправление не является необоснованным. Только имейте в виду, что если вы все еще хотите, чтобы неавторизованные пользователи видели страницу входа (в отличие от авторизованных, но не входящих в список разрешенных пользователей/ролей), то вам придется добавить логику для этого. Я бы не советовал переопределять AuthorizeCore или OnAuthorization; ни одно из них не решает проблему, и их гораздо легче испортить, чем HandleUnauthorizedRequest.

5
ответ дан 7 December 2019 в 05:16
поделиться

В качестве альтернативы вы можете переопределить атрибут авторизации. Вы бы переопределили метод OnAuthorization и получили результат от метода AuthorizeCore из своей базы. На основе этого результата вы можете создать исключение или настраиваемое исключение (то есть, возможно, настраиваемое исключение безопасности, которое регистрирует состояние) прямо из OnAuthirziation.

1
ответ дан 7 December 2019 в 05:16
поделиться

Я полагаю, вы могли бы наследовать от AuthorizeAttribute, а затем переопределить HandleUnauthorizedRequest и поместить туда свою собственную логику перенаправления.

Спасибо,

Хэл

2
ответ дан 7 December 2019 в 05:16
поделиться
Другие вопросы по тегам:

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