【问题标题】:Endpoint belongs to different authority端点属于不同的权限
【发布时间】:2019-06-05 11:54:24
【问题描述】:

尝试使用 Azure AD 作为带有 IdentityModel 包的 OpenID 提供程序

但问题是它会产生错误的端点配置

var client = new HttpClient();

const string identityUrl = "https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/v2.0";
const string restUrl = "https://localhost:44321";

var disco = await client.GetDiscoveryDocumentAsync(identityUrl);
if (disco.IsError)
{
    Console.WriteLine(disco.Error); 
    return;
}

返回错误

端点属于不同的权限: https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/oauth2/v2.0/authorize

openid-configuration 输出为

{"authorization_endpoint":"https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/oauth2/v2.0/authorize",
"token_endpoint":"https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/oauth2/v2.0/token" ... }

oauth2 添加在tenatID 和版本之间。我想这就是 openid 元数据验证失败的原因。

是否可以将 AzureAD 配置为为 openid-configuration 返回正确的元数据?

问候

【问题讨论】:

  • IdentityModel 源代码中有专门的测试DiscoveryPolicyTests.Endpoints_not_beneath_authority_must_be_allowed_if_whitelisted。似乎这个检查是有目的的。但是,可以使用policy.ValidateEndpoints = false 将其关闭。但我非常怀疑转向端点检查是个好主意。

标签: azure-authentication identitymodel


【解决方案1】:

您能找到解决方案吗?我能弄清楚的唯一方法(远不是最佳解决方案)是将端点添加到其他端点基地址列表中。否则,您必须按照上面的 cmets 所述将验证设置为 false。

var client = httpClientFactory.CreateClient();
       var disco = await client.GetDiscoveryDocumentAsync(
            new DiscoveryDocumentRequest
            {
                Address = "https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/v2.0",
                Policy =
                {
                    ValidateIssuerName = true,
                    ValidateEndpoints = true,
                    AdditionalEndpointBaseAddresses = { "https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/oauth2/v2.0/token",
                                                        "https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/oauth2/v2.0/authorize",
                                                        "https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/discovery/v2.0/keys",
                                                        "https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/oauth2/v2.0/devicecode",
                                                        "https://graph.microsoft.com/oidc/userinfo",
                                                        "https://login.microsoftonline.com/00edae13-e792-4bc1-92ef-92a02ec1d939/oauth2/v2.0/logout"
                                                      }
                },
            }
        );

【讨论】:

【解决方案2】:

我也遇到了同样的问题,当我将 IdentityModel 升级到 2.16.1 版本时,问题就解决了

【讨论】:

    【解决方案3】:

    Azure AD 似乎需要 @flacid-snake 建议的附加端点配置。将验证端点设置为 False 是一种安全威胁,应该避免。

    最好的方法是在配置 SSO 服务器时在 UI 中使其可配置,更可取。端点可以改变,它们应该很容易改变。如果您以后决定支持 Okta 或其他提供程序并且它们需要额外的端点,它也会变得更容易。

    从 2021 年 6 月起,您还需要包含 Kerberos 端点,例如: https://login.microsoftonline.com/888861fc-dd99-4521-a00f-ad8888e9ecc8bfgh/kerberos(替换为您的目录租户 ID)。

    【讨论】:

      【解决方案4】:

      如果您查看 IdentityModel 存储库中的代码,您可以看到端点的默认验证通过执行“开始于”方法来验证它们。 https://github.com/IdentityModel/IdentityModel/blob/1db21e2677de6896bc11227c70b927c502e20898/src/Client/StringComparisonAuthorityValidationStrategy.cs#L46

      那么您需要添加的 DiscoveryDocumentRequest 策略字段中仅有的两个必需 AdditionalEndpointBaseAddress 是 "https://login.microsoftonline.com/<guid>""https://graph.microsoft.com/oidc/userinfo"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-08
        • 2013-06-13
        • 1970-01-01
        • 2011-01-26
        • 2021-11-11
        • 1970-01-01
        • 2021-04-01
        相关资源
        最近更新 更多