【发布时间】:2019-12-13 03:13:59
【问题描述】:
我目前正在努力将 ASP.NET Core 2.2 Web API 连接到现有的 Azure AD。我的配置基于 ASP.NET Core 团队的 this sample code。 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 Core 2.2
- JWT 承载认证
- Azure AD(仅令牌验证 + 声明提取 - 创建由其他服务处理)
【问题讨论】:
标签: c# authentication asp.net-core jwt azure-active-directory