尝试通过IdentityModel软件包将Azure AD用作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
{"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" ... }
在tenatID和版本之间添加了 oauth2
。我想这就是为什么openid元数据验证失败的原因。
是否可以将AzureAD配置为为openid配置返回正确的元数据?
致谢
答案 0 :(得分:1)
您能找到解决方案吗?我能弄清楚的唯一方法(永远是最佳解决方案)是将端点添加到其他端点基址列表中。否则,您必须按照上面的注释将验证设置为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"
}
},
}
);
答案 1 :(得分:0)
我也遇到了同样的问题,当我将 IdentityModel 升级到 2.16.1 版时,问题就解决了
答案 2 :(得分:0)
Azure AD 似乎需要按照 @flacid-snake
的建议进行其他端点配置。将验证端点设置为 False
是一种安全威胁,应该避免。
最好的方法是使其可配置,最好在配置 SSO 服务器时在 UI 中进行。端点可以更改,并且它们应该易于更改。如果您以后决定支持 Okta 或其他提供商并且他们需要额外的端点,这也将变得更容易。
自 2021 年 6 月起,您还需要包含 Kerberos 端点,例如: https://login.microsoftonline.com/888861fc-dd99-4521-a00f-ad8888e9ecc8bfgh/kerberos(替换为您的目录租户 ID)。
答案 3 :(得分:0)
如果您查看 IdentityModel 存储库中的代码,您可以看到端点的默认验证通过执行“开始于”方法来验证它们。 https://github.com/IdentityModel/IdentityModel/blob/1db21e2677de6896bc11227c70b927c502e20898/src/Client/StringComparisonAuthorityValidationStrategy.cs#L46
那么您需要添加的 DiscoveryDocumentRequest Policy 字段中仅有的两个必需的 AdditionalEndpointBaseAddresses 是 "https://login.microsoftonline.com/<guid>"
和 "https://graph.microsoft.com/oidc/userinfo"
。