2011-04-01 12 views
7

Ho un'applicazione MVC con il seguente blocco interno in web.config:C# MVC: come sovrascrivere il reindirizzamento dell'autenticazione configurato?

<authentication mode="Forms"> 
    <forms loginUrl="~/Login" timeout="2880" /> 
</authentication> 

Quindi, se un utente richiede una pagina e l'autorizzazione non riesce, saranno reindirizzati a ~/Login.

va bene, e ne ho bisogno per la maggior parte dei miei controllori. Tuttavia, ho un controller con cui vorrei aggirare questa regola. Come posso consentire a specifici controller di ignorare questa regola?

mio problema è che nella mia applicazione MVC (che ha diversi controller), ho un certo controllo che ospita un'interfaccia REST (non inteso per l'uso del browser). Dato che questo controller non è pensato per il consumo del browser, non voglio che invii un'intera pagina di login, (o qualsiasi pagina in realtà, solo stringhe o viste parziali.)

Nota che sto usando il custom [Autorizza ...] attributi su mie azioni, e quando queste falliscono, reindirizzano ad un'azione errore - ma, purtroppo, la mia azione errore (che restituisce una stringa breve) viene reindirizzato alla pagina di login a causa di questo impostazione di configurazione!

sto ottenendo vertigini cercando di capire questo fuori, che cosa sto facendo male? Posso fornire maggiori dettagli se necessario.

+0

State eredita da AuthorizeAttribute o implementating IAuthorizationFilter –

+0

Ereditare da AuthorizeAttribute. –

risposta

11

Si potrebbe estendere la classe AuthorizeAttribute e sovrascrivere HandleUnauthorizedRequest, si può decidere di restituire un codice di stato HTTP Proibita, piuttosto che un messaggio personalizzato.

public class CustomAuthorizationAttribute : AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     // You need to set this action result to something other than a HttpUnauthorizedResult, 
     // this result will cause the redirection to the login page 

     // Forbidden request... does not redirect to login page 
     // filterContext.Result = new HttpStatusCodeResult(403); 

     filterContext.Result = new ErrorActionResult { ErrorMessage = "Unauthorized Access" }; 
    } 
} 

public class ErrorActionResult : ActionResult 
{ 
    public string ErrorMessage { get; set; } 

    public override void ExecuteResult(ControllerContext context) 
    { 
     context.HttpContext.Response.Write(this.ErrorMessage); 
    } 
} 
+0

Hai definito il mio problema su: restituendo un 401 Non autorizzato lo stava causando il reindirizzamento. L'uso di Forbidden sembra una buona soluzione, anche se a dire il vero preferirei che un utente veda "Non autorizzato" piuttosto che "Proibito" in questo caso. Ma userò semplicemente proibito. –

2

Aggiungere il seguente testo dopo il vostro elemento system.web nel web.config:

<location path="home"> 
<system.web> 
    <authorization> 
     <allow users="*" /> 
    </authorization> 
</system.web> 
</location> 

Ciò consentirà agli utenti non autenticati accesso a "/ home", e quindi eventuali azioni sul HomeController.

+0

Non mi piace l'idea di mettere questo nel web.config, dal momento che questa è una cosa che non voglio essere in grado di dimenticare accidentalmente per distribuire o sovrascrivere accidentalmente. Ma questo potrebbe essere un buon approccio in altre situazioni, grazie. –

Problemi correlati