2016-10-01 124 views
2

在此事先感謝您的幫助!使用Auth0在ASP.NET中按角色/組授權授權

我希望有人能幫我弄清楚如何授權Auth0授權擴展中分配的組的API訪問。

我目前正在使用Web API中的[Authorize]屬性 - 它允許api調用,如果他們已經成功登錄並阻止它,如果沒有。

但是,如果我嘗試[授權(角色=「myGroupName」)]授權失敗。如果我在Auth0網站的用戶儀表板中手動添加用戶app_metadata,而不是通過擴展名進行分配,則會發生同樣的情況。

我的項目是通過遵循Angular Quick Start和Asp.Net快速入門設置的。我webapiconfig,我驗證令牌服務器端是:

class WebApiConfig 
{ 
    public static void Register(HttpConfiguration configuration) 
    { 
     var clientID = WebConfigurationManager.AppSettings["auth0:ClientId"]; 
     var clientSecret = WebConfigurationManager.AppSettings["auth0:ClientSecret"]; 

     configuration.MessageHandlers.Add(new JsonWebTokenValidationHandler() 
     { 
      Audience = clientID, 
      SymmetricKey = clientSecret 
     }); 

     configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", 
      new { id = RouteParameter.Optional }); 
    } 
} 
+0

任何幫助都是值得讚賞的。 – IfTrue

+1

默認情況下,JsonWebTokenValidationHandler類不會添加聲明角色。看看這個線程https:// auth0。com/forum/t/how-to-push-claims-to-users-profile-on-auth0-from-asp-net-5-mvc-6/2424/13 –

回答

4

Auth0 Authorization擴展目前通過組的概念支持授權決定。您可以創建一個組,將用戶分配到該組,並將應用程序配置爲只能由特定組中的用戶訪問。所有這些都會自動處理,應用程序預期組以外的任何用戶都將被拒絕完全訪問。

您的使用案例有點不同,但仍然有效。您希望將配置了擴展名的組沿着生成的令牌發送,以便應用程序根據這些值進行授權決策。

爲了讓擴展中配置的組在令牌中一起發送,您需要做的第一件事是請求它們。爲此,您需要在執行身份驗證請求時包含groups範圍。

添加用戶的組成員到傳出令牌(其可以通過基團的OpenID範圍被請求);

(重點是我的,來源:Authorization Extension Docs,部分規則行爲

如果您使用範圍請求令牌,然後將其在jwt.io解碼,你會得到類似這樣的東西(實際組會因用戶而異):

{ 
    "groups": [ 
    "GROUP-1", 
    "GROUP-2" 
    ], 
    "iss": "https://[tenant].auth0.com/" 
} 

現在,在ASP .NET API端驗證此信息。假設你正在使用的樣品是這個(ASP.NET Web API),包含在令牌中的組信息將被映射到以下主張:

  • 類型:groups |價值:GROUP-1
  • 類型:groups |值:GROUP-2

這是因爲存在於JsonWebToken類處理陣列通過創建每個值權利要求共享相同類型從JWT有效載荷來的邏輯。

最後一部分是確保AuthorizeAttribute檢查類型爲groups的這些聲明,而不是嘗試查找角色聲明。您應該可以通過將JsonWebToken類中的RoleClaimType常數更改爲"groups"而不是"http://schemas.microsoft.com/ws/2008/06/identity/claims/role"來實現此目的。

+0

我轉而不依賴第三方,但我感謝您花時間回答。我覺得這最好解決了問題的多個方面。 – IfTrue

+0

想要添加更多關於如何添加請求的詳細信息。這就是我的工作方式。 //配置Auth0 鎖=新Auth0Lock(myConfig.clientID,myConfig.domain,{ AUTH:{ PARAMS:{範圍: '的OpenID組'}, } }); –

0

我無權評論所以我打算從這裏查詢。爲什麼我記得當我實施基於組授權我還在打字周圍

[Authorize(Roles = "myRoleName")] 

沒有別的辦法,你就這樣

[Authorize(Roles = "myGroupName")] 

+0

嘿,男人不用擔心 - 我收到評論的東西。我已經嘗試了兩種方式 - 手動將應用程序元數據分配給角色,並使用組的授權擴展。但是,當使用Auth0處理令牌時,兩者都顯示爲「Group」聲明。 – IfTrue

2

就像你所知道的那樣,Authorize屬性使用主體中的內容:繼承IPrincipal的內容。 在web api中,它更具體;這是繼承ClaimsPrincipal(這實現了自己IPrincipal)。 正如你當然知道的那樣,索賠就像一個鍵值對。 ClaimsPrincipal包含一系列直接來自身份驗證令牌的鍵值對。此認證令牌大多數時間由認證服務器發佈爲JWT(Json Web令牌)。大多數情況下,身份驗證服務器正在使用OAuth,就像您的情況一樣。 如果您希望作爲應用程序中的角色的用戶組通過使用開箱即用的授權屬性不起作用,這是因爲它沒有正確映射:Auhtorize檢查聲明類型爲http://schemas.microsoft.com/ws/2008/06/identity/claims/role (「聲明類型」是鍵值對的「鍵」)。這意味着如果你想讓你的Authorize工作,這個聲明必須與該團體一起評估。 您可以在應用程序中執行幾項操作以獲得乾淨的授權。

  • 定製Authorize屬性。此Authorize屬性將使用不同的聲明類型來檢查角色。引用用戶組的索賠類型取決於您的驗證服務器。如果在驗證服務器的文檔中未找到用於組的索賠類型,請在調試中運行應用程序,並檢查控制器屬性User中包含的每個索賠。您一定會找到您感興趣的索賠類型。
  • 通過重新定義用戶信息和生成的令牌聲明之間的映射來更改授權服務器的設置(在您的情況下,將用戶映射到聲稱具有類型http://schemas.microsoft.com/ws/2008/06/identity/claims/role)。通常,這可以根據客戶端應用程序甚至全局來設置。例如,如果您使用ADFS身份驗證,AzureAD或WSO2身份驗證服務器(http://wso2.com/products/identity-server/
  • 添加一個owin中間件來修改當前主體,則這是必須完成的方式。它將通過將包含組的索賠的值複製到索賠類型http://schemas.microsoft.com/ws/2008/06/identity/claims/role中來更改當前主體。這個中間件必須在認證中間件後插入到流程中
+0

謝謝你的回答。 – IfTrue