2014-04-09 30 views
5

我目前組建了一個自定義的OWIN認證的中間件,以便重新使用我們的中央認證機制的過程。採取控制器屬性考慮從OWIN認證中間件

爲了控制對頁面的訪問,我在控制器上使用[Authorize][AllowAnonymous]屬性。

儘管我明白OWIN中間件和屬性處於頁生命週期的不同階段,但我想知道是否有辦法通知中間件AllowAnonymous屬性存在,並且不需要進一步處理請求。

通常情況下,讓中間件觸發認證過程(在我的情況下,暗示轉到遠程頁面 - OAuth2類型的認證)將是一個問題,當訪問應該匿名訪問的網站的入口頁面。

不要任何人知道的方式來實現這一目標?

回答

3

我知道這是真的老了,但我有同樣的問題。如果你還沒有找到答案,也幫助別人誰來找:

要記住中間件的事情是,你得到的控制器把它買走,後響應之前處理請求。所以,你不需要直接訪問屬性,你只需要查看他們的結果。

考慮以下幾點:

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); 
       } 
      } 
     }); 
    } 
} 

我們去檢查,如果從服務的OAuth訪問令牌存在,如果是的話,設置ClaimsPrincipal上的要求(這將使其繞過[Authorized]屬性)。然後,在await next()處理請求後,我們可以檢查響應狀態並設置所需的任何重定向。

顯然,這是一個非常簡單的例子,並沒有考慮之類的角色或索賠進去,但它應該讓你在路上。