0

我正在开发托管在 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 -AAD管理员为 AAD 中的所有用户授予应用程序权限的租户。

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

就我而言,我只想让用户使用他们的公司帐户登录并在登录后阅读他们的电子邮件(没有其他个人资料数据)。所以我认为请求范围“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 管理员来说非常令人困惑,我真的想呈现一个与我的权限请求匹配的对话框。

4

2 回答 2

0

我将解释这两点:

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

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

如果您不希望 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管理员同意页面上的范围解释为:允许用户使用其工作或学校帐户登录应用,并允许应用查看基本用户个人资料信息。

在此处输入图像描述

于 2021-03-16T07:51:59.070 回答
0

默认情况下,如此处所示客户端将要求提供 openid 和配置文件:

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

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

        options.Scope.Clear();
        options.Scope.Add("openid");
        options.Scope.Add("email");
        options.Scope.Add("myscope");
于 2021-03-14T16:05:53.157 回答