如何使用 IdentityServer 4 为多租户应用程序触发 admin_consent 流?

Posted

技术标签:

【中文标题】如何使用 IdentityServer 4 为多租户应用程序触发 admin_consent 流?【英文标题】:How do I trigger the admin_consent flow using IdentityServer 4 for a multi-tenant app? 【发布时间】:2017-07-14 15:54:32 【问题描述】:

我正在使用 asp.net 核心上的 IdentityServer 4 作为我的客户端应用程序和使用 openIdConnect 的 Azure Active Directory 之间的中间人来构建 POC 多租户应用程序。当用户从尚未授权使用该应用的新 AAD 租户登录时,是否有办法触发 admin_consent 流程?

This Azure sample 展示了如何使用客户端站点上的控制器执行手动同意,该控制器从头开始构建 AAD Uri,但我正在拍摄一种体验,即来自新目录的用户访问我的站点,被踢到AAD 通用端点,登录并显示一个 UI,以授权其目录中的应用程序。

现在我输入了那个,我想问题是 AAD 可能不会 有办法被告知跳过“未在您的目录中注册” 错误屏幕,因此新租户的 AAD 管理员需要 无论如何都要提前自行执行 admin_consent 工作流程。

我仍然想知道 IdentityServer 是否可以启动该过程(即 - 可以操纵 openIdConnect Uri),因为我想通过 IdentityServer 运行所有身份工作流,包括我的管理员同意工作流。

【问题讨论】:

我已经考虑了更多,并意识到从新租户登录的用户的 admin_consent 工作流意味着任何拥有 AAD 的人都可以在他们的目录中注册我的应用程序,如果他们没有的话一个真正的合作伙伴,对他们(我可以读取你的数据)和我(在这里,看看我的应用程序,陌生人)来说都是一个问题。无论如何,我仍然对核心问题感兴趣 - 如何修改 ID4 的身份验证流程以包含 admin_consent 令牌 【参考方案1】:

对于多租户应用程序,应用程序的初始注册位于开发人员使用的 Azure AD 租户中。当来自不同租户的用户首次登录应用程序时,Azure AD 会要求他们同意应用程序请求的权限。

此同意体验会受到应用程序请求的权限的影响。 Azure AD 支持两种权限,仅限应用和委派。 仅限应用权限始终需要租户管理员的同意。如果您的应用程序请求仅应用程序权限并且普通用户尝试登录该应用程序,您的应用程序将收到一条错误消息,指出用户无法同意,例如:此应用程序需要另一个应用程序权限应用。应用程序权限的同意只能由管理员执行。

如果您的应用程序使用需要管理员同意的权限,您需要在应用程序中使用手势,例如管理员可以启动操作的按钮或链接。您的应用程序为此操作发送的请求是通常的 OAuth2/OpenID Connect 授权请求,但也包括 prompt=admin_consent 查询字符串参数。例如:

https://login.microsoftonline.com/common/oauth2/authorize?client_id=&response_type=code&redirect_uri=&scope=openid&prompt=admin_consent

使用此查询字符串,需要管理员同意,如果您使用普通用户(不是管理员),您将收到如下错误:此操作只能由管理员执行您可以检查是否根据您的要求添加查询字符串。在您的场景中,您可以单击 here 获取有关如何使用 Azure AD 外部登录配置 Identity Server4 的代码示例。如果要强制管理员同意流程,可以在配置OpenIdConnectOptions时处理OnRedirectToIdentityProvider事件,并通过调用ProtocolMessage添加提示查询字符串参数。提供的 RedirectContext 上的 SetParameter 方法:

        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”值不是“3.1.2.1.openid-connect-core-1_0 身份验证请求”部分的 OpenID Connect 规范中提到的值。如何知道可用的可能值? 这取决于身份提供者。 Azure AD 支持多租户 Azure AD 应用的 OAuth 管理员同意。请查看here

以上是关于如何使用 IdentityServer 4 为多租户应用程序触发 admin_consent 流?的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer 4,如何添加自定义登录页面

如何基于 K8S 多租能力构建 Serverless Container

如何在 Rails 4 中为多对多关联制作带有子表单的表单?

如何在 Rails 4.2 中为多对多关联创建表单

如何覆盖由 IdentityServer3.accesstokenvalidation 引起的服务耦合

IdentityServer4 - 如何从另一个 ApiResource 调用一个 ApiResource