2014-04-09 11 views
5

Obecnie jestem w trakcie tworzenia niestandardowego oprogramowania pośredniego do uwierzytelniania OWIN, aby ponownie użyć naszego centralnego mechanizmu uwierzytelniania.Uwzględnij atrybut kontrolera w oprogramowaniu do uwierzytelniania OWIN

Aby kontrolować dostęp do stron, używam atrybutów [Authorize] i [AllowAnonymous] w kontrolerach.

Chociaż rozumiem oprogramowanie pośrednie OWIN i atrybut jest na bardzo różnych etapach cyklu życia strony, zastanawiałem się, czy istnieje sposób powiadomienia middleware, że atrybut AllowAnonymous jest obecny i nie ma potrzeby, aby dalej przetwarzać prośbę.

Zwykle, gdy oprogramowanie pośredniczące uruchamia proces uwierzytelniania (w moim przypadku sugerowanie przejścia na stronę zdalną - uwierzytelnianie typu OAuth2) byłoby problemem podczas uzyskiwania dostępu do strony wejściowej witryny, która powinna być dostępna anonimowo .

Czy ktoś wie w jaki sposób to osiągnąć?

Odpowiedz

3

Wiem, że to jest naprawdę stare, ale miałem ten sam problem. Jeśli jeszcze nie znalazłeś odpowiedzi, ale także, aby pomóc innym, którzy przyjdą szukać:

Należy pamiętać o oprogramowaniu pośredniczącym, aby zająć się żądaniem, zanim sterownik go otrzyma, a następnie odpowiedzieć. Nie musisz więc bezpośrednio uzyskiwać dostępu do atrybutów, po prostu musisz szukać ich wyników.

Rozważmy następujący:

namespace CustomAuthApp.MVC 
{ 
    public partial class Startup 
    { 
     public void ConfigureAuth(IAppBuilder app) 
     { 
      app.Use(async (ctx, next) => 
      { 
       if (ctx.ExtensionMethodToCheckIfAccessTokenExistsInRequestMaybeAsACookie()) 
       { 
        var ident = new ClaimsIdentity("External"); 
        ctx.Request.User = new ClaimsPrincipal(ident); 
       } 

       await next(); 

       if (ctx.Response.StatusCode == 401) 
       { 
        var loginUri = String.Format("{0}?ReturnUrl={1}", "/Account/Login", ctx.Request.Path); 
        ctx.Response.Redirect(loginUri); 
       } 
      } 
     }); 
    } 
} 

Dostajemy sprawdzić, jeśli dostęp Reklamowe z serwisu OAuth istnieje, a jeśli tak, to ustaw ClaimsPrincipal na żądanie (co pozwoli ominąć atrybut [Authorized]). Następnie po przesłaniu żądania przez await next() możemy sprawdzić status odpowiedzi i ustawić wymagane przekierowania.

Oczywiście jest to bardzo prosty przypadek i nie uwzględnia takich kwestii, jak role lub roszczenia, ale powinien doprowadzić cię w dalszą drogę.

Powiązane problemy