2011-12-22 2 views
1

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

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

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

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

Любые идеи?

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

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; 
     } 
    } 
+0

КИ, просто пытаюсь играть с некоторыми различными сценариями, я добавил свой CustomErrors раздел в раздел system.web и попыталась это с 404. В этом случае (в связи с TrySkipIisCustomErrors я полагаю), я что мне даже не нужен раздел httpErrors. Однако, если я попытаюсь добавить 403, страница все равно не будет решена. Это то, как браузеры интерпретируют 403? Не разрешат ли они перенаправить 403? –

ответ

0

ОК, я не уверен, если это действительно правильно или нет, но он подходит мои симптомы. 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); 
    }