gpt4 book ai didi

c# - ASP.NET Core 2.2 中的 Azure AD 身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 22:31:36 25 4
gpt4 key购买 nike

我目前正在努力将 ASP.NET Core 2.2 Web API 连接到现有的 Azure AD。我的配置基于 this sample code由 ASP.NET Core 团队开发。 Cookie 已替换为 JWT。

无法从元数据地址检索文档

现在我遇到以下错误信息:

IOException: IDX10804: Unable to retrieve document from: {MetadataAdress}.

- Microsoft.IdentityModel.Protocols.HttpDocumentRetriever+<GetDocumentAsync>d__8.MoveNext()
- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
- System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
- Microsoft.IdentityModel.Protocols.OpenIdConnect.OpenIdConnectConfigurationRetriever
+<GetAsync>d__3.MoveNext()
- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
- System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
- Microsoft.IdentityModel.Protocols.ConfigurationManager+<GetConfigurationAsync>d__24.MoveNext()

当我直接调用 URL 时,我会收到带有配置文件的即时响应。但是,代码似乎无法做到这一点。我不确定是什么原因。

Azure AD 配置语法

导致此问题的最可能原因是配置错误。也许我弄错了字段的语法或遗漏了重要的值。

连接信息字段

连接信息字段是这样提供的:

    TenantId:     {Tenant-GUID}
Authority: https://login.microsoftonline.com/{TenantId}
Resource: https://{resource-endpoint}.{resource-domain}
ClientId: {Client-GUID}
ClientSecret: {ClientSecret}

服务配置

Startup.cs 中的身份验证服务配置如下所示:

    services
.AddAuthentication(options => {
options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddJwtBearer()
.AddOpenIdConnect(options => {
options.ClientId = this.ClientId;
options.ClientSecret = this.ClientSecret;
options.Authority = this.Authority;
options.Resource = this.Resource;
options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
options.SignedOutRedirectUri = "/signed-out";
options.Events = new OpenIdConnectEvents()
{
OnAuthorizationCodeReceived = async context =>
{
var request = context.HttpContext.Request;
var currentUri = UriHelper.BuildAbsolute(
request.Scheme, request.Host, request.PathBase, request.Path
);
var credentials = new ClientCredential(this.ClientId, this.ClientSecret);
var authContext = new AuthenticationContext(
this.Authority,
AuthPropertiesTokenCache.ForCodeRedemption(context.Properties)
);

var result = await authContext.AcquireTokenByAuthorizationCodeAsync(
context.ProtocolMessage.Code,
new System.Uri(currentUri),
credentials,
this.Resource
);

context.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
};

// Custom
options.MetadataAddress = $"{this.Authority}/federationmetadata/2007-06/federationmetadata.xml";
options.RequireHttpsMetadata = false; // Dev env only
}

现有的 API

有大量现有的 Web API 连接到此 Azure AD。遗憾的是,他们都在使用完整的 .NET Framework。它们使用 Microsoft.Owin.Security.ActiveDirectory 命名空间的 WindowsAzureActiveDirectoryBearerAuthenticationExtensions 中的 UseWindowsAzureActiveDirectoryBearerAuthentication 方法。

他们使用的另一件事是 HostAuthenticationFilter,其身份验证类型为 Bearer

问题

问题是什么?

我该如何解决这个问题?

如何一起使用这些组件?

  • ASP.NET 核心 2.2
  • JWT 承载身份验证
  • Azure AD(仅 token 验证 + 声明提取 - 创建由其他服务处理)

最佳答案

您正在使用 OpenIDConnect 库并将它们指向 WS-Federation 元数据 (/federationmetadata/2007-06/federationmetadata.xml)。这是行不通的。

OpenIDConnect 的正确元数据端点是 /.well-known/openid-configuration。这是 described here .首先更改它,然后返回 cookie。

更新

我监督的是您正在保护 WebAPI。你说中间件使用 JwtBearer 作为默认身份验证方案,但你还包括一个质询方案 OIDC。这对我来说真的没有意义。为什么要为 WebAPI 使用 OIDC 质询方案?

在这里您可以找到 ASP.NET Core 示例 about JwtBearer .这里是Azure AD samples demoing WebApp calling WebApi (也是 WebAPI 的承载者,应用程序前端的 OIDC。

没有使用 OIDC 质询的 JWT Bearer Auth 示例。你为什么要实现它?什么情况?您可能正在考虑实现多个身份验证方案,这是可能的。但是没有一种方案用于身份验证而另一种方案用于挑战...

如果通过更新/删除错误的元数据更改了错误消息,请将其包含在您的原始问题中。就像现在一样——纯粹的错误消息是 OIDC 中间件无法解析 WS-Federation 元数据。这是预期的。

关于c# - ASP.NET Core 2.2 中的 Azure AD 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57361261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com