IIS7.5 HttpErrors ExecuteURL не выполняется - PullRequest
1 голос
/ 23 декабря 2011

Я полностью озадачен этим. По сути, у меня есть страница MVC с пользовательским атрибутом AuthorizeAttribute, который выдает ошибку 403, если пользователь аутентифицирован, но не имеет соответствующего доступа. У меня проблема в том, что я хотел бы перенаправить эту ошибку на пользовательский контроллер / действие (/Error/Unauthorized).

Я добавил следующее в мой web.config

<httpErrors errorMode="Custom">
  <remove statusCode ="403" subStatusCode="-1"/>
  <error statusCode="403" path="/Error/Unauthorized" responseMode="ExecuteURL" />
</httpErrors>

При указанной конфигурации я не вижу перенаправления IIS 7.5 403 по умолчанию. Впрочем, я тоже ничего не вижу. В IE он говорит мне, что веб-сайт требует, чтобы вы вошли в систему, а Chrome просто показывает мне пустую страницу.

Есть идеи?

Вот пользовательский код авторизации на случай, если это может помочь

    public class CustomAuthorize : AuthorizeAttribute
    {
        //Property to allow array instead of single string.
        private string[] _authorizedRoles;

        public string[] AuthorizedRoles
        {
            get { return _authorizedRoles ?? new string[0]; }
            set { _authorizedRoles = value; }
        }

        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            base.HandleUnauthorizedRequest(filterContext);
            if (filterContext.HttpContext.Request.IsAuthenticated)
            {
                filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
                filterContext.Result = new HttpStatusCodeResult(403);
            }
        }

        protected override bool AuthorizeCore(HttpContextBase httpContext)
        {
            if (httpContext == null)
                throw new ArgumentNullException("httpContext");

            if (!httpContext.User.Identity.IsAuthenticated)
                return false;

            //Check to see if any of the authorized roles fits into any assigned roles only if roles have been supplied.
            if (AuthorizedRoles.Any(httpContext.User.IsInRole))
                return true;

            return false;
        }
    }

1 Ответ

0 голосов
/ 23 декабря 2011

ОК, я не уверен, действительно ли это правильно или нет, но это соответствует моим симптомам.http://forums.asp.net/t/1462153.aspx/1 Я не рад, что мне приходится кодировать перенаправление, но я попытался сделать его хотя бы явным для обеспечения удобства сопровождения в будущем.

    public bool RedirectAuthenticatedButUnauthorizedUsers { get; set; }

    private String _redirectUnauthorizedUrl = String.Empty;
    public String RedirectUnauthorizedUrl
    {
        get { return _redirectUnauthorizedUrl; }
        set { _redirectUnauthorizedUrl = value.Trim(); }
    }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        base.HandleUnauthorizedRequest(filterContext);
        if (!RedirectAuthenticatedButUnauthorizedUsers || !filterContext.HttpContext.Request.IsAuthenticated)
            return;
        if(RedirectUnauthorizedUrl == String.Empty)
            throw new NullReferenceException("RedirectAuthenticatedButUnauthorizedUsers " +
                                             "set to true, but no redirect URL set.");
        filterContext.HttpContext.Response.Redirect(RedirectUnauthorizedUrl);
    }
...