【问题标题】:Admin Consent dialog requests different permissions then requested管理员同意对话框请求不同的权限,然后请求
【发布时间】:2021-06-12 00:01:20
【问题描述】:

我正在开发托管在 azure 中的 asp.net core .net 5 Web 应用,我想为我们的客户提供 SSO 体验。

作为参考,我以 https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/2-WebApp-graph-user/2-3-Multi-Tenant 中的示例为例,其中 AAD 管理员为 AAD 中的所有用户授予应用程序权限。

该示例使用此处描述的管理员同意 URL:https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-admin-consent#request-the-permissions-from-a-directory-admin

就我而言,我只想让用户使用他们的公司帐户登录并在登录后阅读他们的电子邮件(没有其他个人资料数据)。所以我认为请求范围“openid”和“email”就足够了。但不管我提供什么范围值,呈现给管理员的对话框会显示其他权限请求(看起来像“profile”和“offline_access”(?)):

我这样构建网址:

var state = Guid.NewGuid().ToString();
var currentUri = UriHelper.BuildAbsolute(
   httpContext.Request.Scheme,
   httpContext.Request.Host,
   httpContext.Request.PathBase);

var authorizationRequest = string.Format(
   "https://login.microsoftonline.com/organizations/v2.0/adminconsent?client_id={0}&scope={1}&redirect_uri={2}&state={3}", 
   Uri.EscapeDataString(this.microsoftIdentityOptions.ClientId),   
   Uri.EscapeDataString("openid email"),                           
   Uri.EscapeDataString(currentUri + "tenant/processcode"),        
   Uri.EscapeDataString(state));                 

生成的请求如下所示:

有趣的是,如果管理员授予对应用程序的访问权限,并且如果我检查 AAD 中“企业应用程序”的权限,我会看到我最初想要的“电子邮件”和“openid”权限:

但这让 AAD 管理员非常困惑,我真的很想呈现一个与我的权限请求匹配的对话框。

【问题讨论】:

  • 离线访问权限可能意味着您正在获取刷新令牌。个人资料看起来有点奇怪 - 即使您只请求 ID 令牌中的电子邮件,它也似乎表示同意个人资料。我认为你应该向微软寻求支持。

标签: c# azure openid-connect microsoft-identity-web


【解决方案1】:

默认情况下,如图here,客户端会询问openid和profile:

        Scope.Add("openid");
        Scope.Add("profile");

这就是为什么您通常会看到对 Clear() 的调用,以清除此默认范围列表,例如:

        options.Scope.Clear();
        options.Scope.Add("openid");
        options.Scope.Add("email");
        options.Scope.Add("myscope");

【讨论】:

  • 感谢您的想法。我尝试在 AddMicrosoftIdentityWebApp(options => this.configuration.Bind("AzureAd", options); options.Scope.Clear(); options.Scope.Add("openid"); options.Scope.Add("email"); 方法中重置范围,但它并没有改变对话框
  • 一个想法是查看初始身份验证请求并验证是否将预期范围发送到身份提供者。
  • 我用初始身份验证请求构建的图像更新了我的问题。在那里我只能看到请求的 2 个范围“openid”和“email”。
  • 我认为身份提供者的实施者可以随心所欲地做他们喜欢的事情,在您的情况下,他们也许总是包含个人资料?或者,如果你想更好地控制登录体验,你可以添加你的身份提供者,比如中间的 IdentityServer
【解决方案2】:

我将解释这两点:

  1. 这是一个已知问题。使用 v2.0 端点时,即使不添加 offline_access 范围,仍然会显示在管理员同意页面中,目前无法删除。 official documentation 也解释了这一点。

此权限目前显示在所有同意页面上,即使对于流程也是如此 不提供刷新令牌(例如隐式流)。这 setup 解决了客户端可以在隐式中开始的场景 流,然后转到需要刷新令牌的代码流。

如果您不希望 offline_access 范围出现在初始管理员同意页面中,您可以使用 v1.0 端点。 (但是1.0的端点只能请求静态权限)

https://login.microsoftonline.com/{tenant-id}/adminconsent?client_id={0}&scope={1}&redirect_uri={2}&state={3}
  1. 如果应用程序使用 OpenID Connect 登录,它必须请求 openid 范围。 openid 范围默认包括 profile 范围,这是设计使然! openid 的范围在管理员同意页面上解释为:允许用户使用其工作或学校帐户登录应用,并允许应用查看基本用户个人资料信息。

【讨论】:

  • 如果我的回复对您有帮助,您可以采纳,谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-01-24
  • 1970-01-01
  • 2011-09-19
  • 2014-02-08
相关资源
最近更新 更多