OWIN OpenIDConnect中間件在Azure Active Directory環境中引用的客戶端ID用於標識應用程序本身,而不考慮租戶的身份。
對於多租戶支持,如果進入應用程序的「配置」部分,在用於應用程序開發的AD下,您應該注意到一個標籤爲「APPLICATION IS MULTI-TENANT」的選項,如屏幕截圖所示。 Multi-Tenant Option
確保啓用了多租戶支持。在嘗試啓用該選項時,啓用多租戶支持還有其他一些要求。
此選項將允許其他租戶的AAD同意使用您的應用程序。在行動中,一旦租戶的AAD全局管理員同意,這實際上會將您在AAD中註冊的應用程序添加到其AAD中,從而允許他們根據需要控制訪問權限,而無需對您進行任何更改。
說到代碼,您必須更改OWIN中間件以禁用發行者的自動驗證,並實施您自己的驗證發行者的機制(例如在租戶初始註冊時存儲所有信息並檢查所有未來租戶登錄最初存儲的信息)。具體如下:
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = ClientId,
Authority = Authority,
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
{
// instead of using the default validation (validating against a single issuer value, as we do in line of business apps),
// we inject our own multitenant validation logic
ValidateIssuer = false,
},
Notifications = new OpenIdConnectAuthenticationNotifications()
{
// we use this notification for injecting our custom logic
SecurityTokenValidated = (context) =>
{
// retriever caller data from the incoming principal
string issuer = context.AuthenticationTicket.Identity.FindFirst("iss").Value;
string UPN = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.Name).Value;
string tenantID = context.AuthenticationTicket.Identity.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid").Value;
if (
// the caller comes from an admin-consented, recorded issuer
(db.Tenants.FirstOrDefault(a => ((a.IssValue == issuer) && (a.AdminConsented))) == null)
// the caller is recorded in the db of users who went through the individual onboardoing
&& (db.Users.FirstOrDefault(b =>((b.UPN == UPN) && (b.TenantID == tenantID))) == null)
)
// the caller was neither from a trusted issuer or a registered user - throw to block the authentication flow
throw new SecurityTokenValidationException();
return Task.FromResult(0);
}
}
});
來源:https://github.com/Azure-Samples/active-directory-dotnet-webapp-multitenant-openidconnect/blob/master/TodoListWebApp/App_Start/Startup.Auth.cs
之所以禁止發行人確認是由於通用網關在AAD多租戶應用中使用,因此基於該租戶多數民衆贊成驗證發行人的變化。事先必須有一些適當的發行商存儲與之比較。
這非常有幫助,非常感謝! –