2015-10-05 68 views
1

我最近開始使用Azure Active Directory來針對構建於AngularJS上的我的網站對用戶進行身份驗證。使用OWIN Active Directory承載令牌啓用多個租戶

使用博客和sample code on GitHub,我已經與單租戶合作使用ADAL.js和Katana的Bearer Token AD integration

但是,我現在遇到了一些支持多個租戶的問題。

我有一個頁面設置顯示用戶爲ADAL看見他們(通過發現的根範圍內的userInfo),以及讓我的服務器得到由OWIN接走了,序列化context.Authentication.User通話。

客戶端,一切似乎都正常工作。我可以與任何租戶一起登錄,它給了我期望的對象(其中isAuthenticated: true,username已填充,並且profile上的各種屬性描述了用戶,登錄名和租戶)。

如客戶端文檔中所述,通過將tenant參數從我的adalAuthenticationServiceProvider.init調用中取消,從而完成客戶端。

服務器端,但是,UseWindowsAzureActiveDirectoryBearerAuthentication方法不喜歡Tenant(因爲它拋出一個異常)沒有價值。我爲此嘗試了一些值,其中包括我的應用最初註冊的租戶,以及我最喜歡的「普通」租戶,但不管我放在哪裏(除非它是我嘗試登錄的租戶與,如果我的ADAL與該租戶成立),它似乎只是略過了這一點。

值得一提的是,實際的API調用在[Authorize]篩選器上失敗並返回401,這告訴我這對OWIN攔截器不是問題。

如何識別UseWindowsAzureActiveDirectoryBearerAuthentication以支持多租戶認證?

回答

0

我在寫這個問題時想到了這一點。我認爲。但是我整天在這個問題上度過了幾乎沒有關於這個問題的文件,所以我想我會發布它。

我的解決方案(通過yet another blog post找到)包括ValidateIssuer = false作爲參數。這是有道理的,因爲我們不再想驗證給我們一個令牌的租戶是我們列出的那個。

這是我解決問題的代碼。

app.UseWindowsAzureActiveDirectoryBearerAuthentication(
      new WindowsAzureActiveDirectoryBearerAuthenticationOptions 
      { 
       TokenValidationParameters = new TokenValidationParameters 
       { 
        ValidAudience = ConfigurationManager.AppSettings["ida:Audience"], 
        ValidateIssuer = false // This line made it work 
       }, 
       AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active, 
       Tenant = "common" // I don't know whether this has any impact, 
            // but it's a required parameter regardless. 
      }); 

我很願意,如果別人想糾正我,如果這有什麼意外情況 - 這是一點點艱鉅拋「驗證」切換到關閉,當你在工作的認證。但我認爲這一切都足夠有道理。

+0

你應該看看https://github.com/Azure-Samples/active-directory-dotnet-webapp-multitenant-openidconnect/blob/master/TodoListWebApp/App_Start/Startup.Auth.cs – ken

+0

這裏有一個圍繞該配置發表評論:而不是使用默認驗證(針對單個發行商價值進行驗證,就像我們在業務線應用程序中那樣), //我們注入了我們自己的多租戶驗證邏輯 – ken

1

當您正在開發多租戶應用程序時,您不能再依賴100%的默認驗證邏輯。默認驗證邏輯假定您聲明您希望接收令牌的天青AD租戶表單,並且將強制執行,而不僅僅接受該承租人的令牌形式。這是通過檢查與每個租戶關聯的元數據文檔來完成的,其中包含(除其他之外)租戶本身的標識符 - 該標識符必須出現在您收到的令牌中,在iss聲明中:任何其他值都表示該令牌來自另一個租戶,因此它必須被拒絕。根據定義,多租戶應用程序必須接受來自多個租戶的令牌。這是通過使用參數化端點(通用端點,參見this post)完成的,它允許您「延遲綁定」哪個租戶將用於發佈令牌。然而,通用端點將提供通用的元數據文檔,該文檔不能包含特定的iss值:相反,它包含的佔位符在運行時將始終由實際獲得令牌的租戶的頒發者標識符替換。 這意味着在多租戶應用程序中,您必須接管租戶驗證邏輯。如果你只是在調試,你可以關閉它,就像你已經完成的那樣 - 這將阻止默認的發行者驗證邏輯踢入並拒絕輸入的令牌,因爲它的iss值不對應於常見的佔位符。然而,在更現實的情況下,您將在TokenValidationParameters.IssuerValidator代表中編寫自己的邏輯。例如,您可能想比較新來的令牌中的iss值與購買每月訂購服務的租戶列表。 HTH

+0

是的,這很有道理。我的問題並不是關於這一切的理論,而是關於這個階級如何實現它的實際機制。但是,謝謝你的信息。說到實際的機制,你知道OWIN邏輯將處理多少這個?我關心設置'ValidateIssuer = false'只是在身份驗證*方面,我已經得到了授權處理。只要我確信發行人實際上是發出請求的租戶,我就是金。 –

相關問題