2009-09-14 15 views
10

Mam kontroler z krytym Autoryzuj atrybut tak:Jak wyświetlić niestandardową stronę błędu dla wyniku Http 401?

[Authorize(Roles = "Viewer")] 
public class HomeController : Controller 
{ 
    //... 
} 

i mój web.config został customErrors ustawione tak:

<customErrors mode="On"> 
     <error statusCode="401" redirect="notauthorized.html"/> 
    </customErrors> 

Kiedy próbuję wywołać działanie na kontrolerze Home używanie roli nieautoryzowanej Właśnie dostaję pustą stronę. Nie przekierowuję mnie na niestandardową stronę. Jakieś pomysły?

Odpowiedz

0

Standardowe podejście o ile wiem, ma mieć prosty kontroler błędu, który obsługuje żądania przychodzące i wysyła odpowiedni widok w zależności od których httpStatus kod został zwrócony ... coś takiego:

public class ErrorController : Controller 
{ 

    [AcceptVerbs(HttpVerbs.Get)] 
    public ViewResult Index() 
    { 

     //Check if the statuscode is HttpStatusCode.NotFound; 
     if(Response.StatusCode == 401) 
      return View("NotAuthorised"); 
     return View(); 
    } 
} 

i następnie określić działania przekierowania w webconfig:

<customErrors mode="On" defaultRedirect="~/Error" /> 
3

Spójrz na tvanfosson „s Answer z this very similar question, jest to, co robię (dzięki tvanfosson), więc teraz po prostu muszę powiedzieć:

[MyAuthorize(Roles="SuperAdmin",ViewName="AccessDenied")] 
public class SuperAdminController : Controller 
... 

Jeśli użytkownik nie jest w roli, otrzyma widok określony przez ViewName.

Uwaga: pusta strona pochodzi z Cassini, jeśli przenieść aplikację do rzeczywistego serwera IIS Ujrzycie 401.

+0

znaczy jeśli ja przenieść aplikację do IIS i powinni zobaczyć niestandardowa strona? czy powinienem zobaczyć standardową stronę IIS 401? –

+0

Zobaczysz 401. –

9

Doceniam to pytanie jest trochę stary, ale może to komuś pomóc .

Dla 401 prawdopodobnie zobaczysz standardową nieautoryzowaną stronę 401, nawet jeśli dodałeś 401 do sekcji customerrors w twoim web.config. Czytam, że podczas używania IIS i Windows Authentication sprawdza się zanim ASP.NET zobaczy żądanie, stąd widzisz pustą stronę na Cassini i na IIS jest to własnie 401.

Dla mojego projektu redagowałem plik Global.asax aby przekierować na trasę, którą utworzyłem dla błędów 401, wysyłając użytkownika do widoku "Nieautoryzowane, aby to zobaczyć".

W Global.asax:

void Application_EndRequest(object sender, System.EventArgs e) 
    { 
     // If the user is not authorised to see this page or access this function, send them to the error page. 
     if (Response.StatusCode == 401) 
     { 
      Response.ClearContent(); 
      Response.RedirectToRoute("ErrorHandler", (RouteTable.Routes["ErrorHandler"] as Route).Defaults); 
     } 
    } 

aw Route.config:

 routes.MapRoute(
     "ErrorHandler", 
     "Error/{action}/{errMsg}", 
     new { controller = "Error", action = "Unauthorised", errMsg = UrlParameter.Optional } 
     ); 

iw sterowniku:

public ViewResult Unauthorised() 
    { 
     //Response.StatusCode = 401; // Do not set this or else you get a redirect loop 
     return View(); 
    } 
0

Ponadto można tworzyć własne niestandardowy atrybut autoryzacji i ustaw własną trasę do przekierowania użytkowników na y nasza strona.

Oto próbka na moim projekcie:

/*../controllers/CustomAuthorizationAttribute.cs */ 
public class CustomAuthorizationAttribute : FilterAttribute, IAuthorizationFilter 
{ 
    void IAuthorizationFilter.OnAuthorization(AuthorizationContext filterContext) 
    { 
     string session = filterContext.HttpContext.Session["id"] != null ? filterContext.HttpContext.Session["id"].ToString() : null; 
     if (string.IsNullOrEmpty(session)) 
     { 
      // Unauthorized! 
      filterContext.Result = new RedirectToRouteResult(
       new RouteValueDictionary 
       { 
        { "action", "Create" }, { "controller", "Sessions" } 
        //,{ "parameterName", "YourParameterValue" } 
       } 
      ); 
     } 
    } 
} 

i dodać „Flag” w kontrolerze akcji jak ta

/*../controllers/ReportsController.cs */ 
public class ReportsController : Controller 
{ 
    [CustomAuthorizationAttribute] 
    public ActionResult Index() 
    { 
     //do something 
    } 
} 
Powiązane problemy