2016-11-22 78 views
2

我有一個客戶端要求使用自定義角色/成員身份架構的基於集成身份驗證的解決方案。我最初的計劃是使用基於聲明的身份驗證機制和集成身份驗證。但是,我最初的研究並未提供大量有用的信息。基於聲明的身份驗證,帶有活動目錄,沒有ADFS

至此,我有一個ASP.NET(不是核心,也不是owin)WebAPI應用程序,它具有角度SPA(asp.net)Web應用程序使用的api動作。我試圖授權使用集成身份驗證的API調用。我最初的工作主要集中在一個自定義的AuthorizationAttribute和ClaimsAuthenticationManager實現上。然而,隨着我進一步深入,我開始遇到自定義ClaimsAuthenticationManager的問題,在這一點上,我不確定這是適當的路線。

所以我的問題對你們來說,你們至少能給我一些關於如何做到這一點的想法嗎?我不需要代碼中的部分幫助,只需要找出合適的「堆棧」即可。

唯一真正的需求是WebAPI調用可以被授權,通過自定義屬性傳遞聲明的名稱來授權,但聲明不在AD中,即使它使用Windows身份驗證,聲明本身也會來自一個數據庫。

謝謝大家提前!

+1

爲什麼你需要自定義AuthorizationAttribute?通常是相反的 - 你用默認的AuthorizationAttribute裝飾你的控制器並確保你的認證過程確實設置了主體(HttpContext.Current.User和Thread.CurrentPrincipal)。 –

+0

另請參閱https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api以供參考。 –

+0

@OndrejSvejdar最初的想法是使用一個自定義的授權屬性來修飾訪問它們所需的聲明。挑戰在於,雖然我使用Windows身份驗證,但實際的聲明/角色存儲在單獨的數據庫中,而不是存在於活動目錄中。令我困惑的是在ASP.Net WebApi2 OWIN項目中實際使用這個功能。我探討了在中間件中做它以及重寫默認的類功能。我只是不確定具體在哪裏需要集中我的努力。 – Brandon

回答

2

https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api

你的情況是沒有太大的不同:您正在使用AD進行身份驗證

  • 您使用的數據庫的授權

    簡單地說,這可以通過配置來解決web-api使用Windows身份驗證。

    <system.web> 
        <authentication mode="Windows" /> 
    </system.web> 
    

    ,並添加自己IAuthorizationFilter對Web API的管道,將檢查當前主體(應設置),然後覆蓋此主要用自己的(即查詢DB - 獲得索賠,並與您的自定義覆蓋它通過設置HttpContext.Current.UserThread.CurrentPrincipal索賠本金)。 關於如何過濾器添加到的WebAPI管線檢查How to add global ASP.Net Web Api Filters?

    public class CustomAuthenticationFilter : IAuthenticationFilter { 
        public bool AllowMultiple { get { return true; } } 
        public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) { 
        var windowsPrincipal = context.Principal as WindowsPrincipal; 
        if (windowsPrincipal != null) { 
         var name = windowsPrincipal.Identity.Name; 
         // TODO: fetch claims from db (i guess based on name) 
         var identity = new ClaimsIdentity(windowsPrincipal.Identity); 
         identity.AddClaim(new Claim("db-crazy-claim", "db-value")); 
         var claimsPrincipal = new ClaimsPrincipal(identity); 
         // here is the punchline - we're replacing original windows principal 
         // with our own claims principal 
         context.Principal = claimsPrincipal; 
        } 
    
        return Task.FromResult(0); 
        } 
    
        public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) { 
        return Task.FromResult(0); 
        } 
    } 
    
    public static class WebApiConfig { 
        public static void Register(HttpConfiguration config) { 
        config.Filters.Add(new CustomAuthenticationFilter()); 
    
        // Web API routes 
        config.MapHttpAttributeRoutes(); 
        config.Routes.MapHttpRoute(...); 
        } 
    } 
    

    也沒有必要定製的授權屬性 - 使用默認的 - 每個人都瞭解它,使你的代碼更易讀。

  • +0

    我對遲到的反應表示歉意,我在其他事情上被拖了幾天,這是一個非常有用的建議,因此我將其標記爲答案,我仍然必須實現一個自定義的授權屬性做我需要做的,但這個建議讓我的第一個障礙。:) – Brandon

    +0

    我一直在想這個更多,並有另一個問題。所以我有一個提供數據的WebAPI端點,這是Authorize屬性所在的地方。但授權服務器是一臺獨立的機器。我已經使用openiddict完成了一些認證系統,並使用JSON Web令牌來驗證用戶,但客戶端和webapi站點都與認證服務對話。這會類似嗎? – Brandon

    相關問題