2011-04-01 10 views
7

Mam aplikacji MVC z następującym blokiem wewnątrz w pliku web.config:C# MVC: Jak przesłonić skonfigurowane przekierowanie uwierzytelniania?

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

Tak więc, jeśli użytkownik zażąda stronę i autoryzacja nie powiedzie, to zostanie przekierowany do ~/login.

To dobrze, i potrzebuję tego dla większości moich kontrolerów. Mam jednak kontroler, z którym chciałbym ominąć tę regułę. Jak mogę zezwolić określonym kontrolerom na zignorowanie tej reguły?

Mój problem polega na tym, że w mojej aplikacji MVC (która ma kilka kontrolerów), mam pewien kontroler, który hostuje interfejs REST (nie jest przeznaczony do użycia w przeglądarce). Ponieważ ten kontroler nie jest przeznaczony do korzystania z przeglądarki, nie chcę, aby wysyłał całą stronę logowania (lub dowolną stronę, tylko ciągi lub częściowe widoki).

Pamiętaj, że używam niestandardowego [Autoryzuj ...] atrybuty na moich działaniach, a kiedy te się nie powiodą, przekierowują do akcji Błąd - ale, niestety, moja akcja Błąd (która zwraca krótki ciąg) jest przekierowywana do strony logowania z tego powodu ustawienie konfiguracji!

Mam zawroty głowy próbując to zrozumieć, co robię źle? W razie potrzeby mogę podać więcej szczegółów.

+0

Czy dziedziczenie z AuthorizeAttribute lub implementating IAuthorizationFilter –

+0

Dziedziczenie z AuthorizeAttribute. –

Odpowiedz

11

Możesz rozszerzyć klasę AuthorizeAttribute i zastąpić HandleUnauthorizedRequest, możesz chcieć zwrócić kod statusu zabronionego http zamiast niestandardowego.

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

Zdefiniowałeś mój problem z nagłówkiem: zwrot 401 Nieautoryzowany powodował przekierowanie. Używanie Zakazu wydaje się dobrym rozwiązaniem, ale szczerze mówiąc wolę, aby użytkownik zobaczył w tym przypadku "Nieautoryzowany" niż "Zabroniony". Ale po prostu użyję zakazanego. –

2

Dodaj następujące po elemencie system.Web w pliku web.config:

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

Pozwoli nieuwierzytelnionych użytkowników dostępu do „/ home”, a więc wszelkie działania na HomeController.

+0

Nie podoba mi się pomysł umieszczenia tego w Web.config, ponieważ jest to coś, czego nie chcę być w stanie przypadkowo zapomnieć wdrożyć lub przypadkowo nadpisać. Ale to może być dobre podejście w innych sytuacjach, dziękuję. –

Powiązane problemy