對於多租戶應用程序,應用程序的初始註冊位於開發人員使用的Azure AD租戶中。當來自不同租戶的用戶首次登錄到應用程序時,Azure AD會要求他們同意應用程序所請求的權限。
此同意體驗受應用程序請求的權限的影響。 Azure AD支持兩種權限,僅限應用程序和委託。 僅限應用程序權限總是需要租戶管理員的同意。如果您的應用程序請求僅適用於應用程序的權限,並且普通用戶嘗試登錄該應用程序,則您的應用程序將收到一條錯誤消息,指出用戶無法同意,如:此應用程序需要向其他應用程序申請權限。應用程序權限的同意只能由管理員執行。
如果您的應用程序使用需要管理員同意的權限,則需要在應用程序中設置一個手勢,例如管理員可以啓動操作的按鈕或鏈接。應用程序發送該動作請求是一個通常的OAuth2/ID連接授權請求,但也包括提示= admin_consent查詢字符串參數.eg:
https://login.microsoftonline.com/common/oauth2/authorize?client_id= & RESPONSE_TYPE =代碼& REDIRECT_URI = &範圍= OpenID的&提示= admin_consent
有了這個查詢字符串,需要管理員同意,如果你使用普通用戶(非管理員),你會得到這樣的錯誤:此操作只能是由管理員執行您可以檢查是否根據您的要求添加查詢字符串。在您的方案中,您可以單擊here獲取有關如何使用Azure AD外部登錄配置Identity Server4的代碼示例。如果要強制管理員同意的流量,你可以配置OpenIdConnectOptions當處理OnRedirectToIdentityProvider事件,並通過調用ProtocolMessage.SetParameter方法所提供的RedirectContext添加提示查詢字符串參數:
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = schemeName,
DisplayName = "AzureAD",
SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme,
ClientId = clientId,
Authority = $"https://login.microsoftonline.com/{tenantId}",
ResponseType = OpenIdConnectResponseType.IdToken,
StateDataFormat = dataFormat,
Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = context =>
{
context.ProtocolMessage.SetParameter("prompt", "admin_consent");
return Task.FromResult(0);
}
}
});
我已經想到了這一點,並認識到,從新租戶登錄的用戶的admin_consent工作流意味着任何有AAD的人都可以在我的應用程序註冊到他們的目錄中,如果他們不是真正的合作伙伴,他們(我可以讀你的數據)和我(這裏,有一個看看我的應用程序,陌生人)。無論如何,我仍對核心問題感興趣 - 如何修改ID4的身份驗證流程以包含admin_consent標記 – Josh