我正在尝试使用来自azure活动目录的访问令牌来构建一个新的WebApi。
我使用的是.net核心版本3.1和VisualStudio2019。
我使用"Asp.net核心web应用程序“模板创建了一个新项目,并选择了一个"API”项目,并将身份验证类型更改为"Work或School Account“,并将Api设置为Api://Automation/TestApi
然后,Visual为我提供了一个带有模拟天气预报服务的web,如果我注释掉此服务,它将在浏览器中按预期很好地扩展。它还在AzureActive目录中创建了一个应用程序注册。
在权限属性返回的情况下,我很难从客户端应用程序调用API,所以我决定使用postman调用API来查看到底发生了什么。
我在应用程序注册中添加了一个客户端秘密,visual创建并将一个postman请求放在一起,如下所示,使用Application ( client ) Id和api://Automation/TestApi/..default作为作用域。

这很好,并返回一个访问令牌,但是,当我尝试使用该访问令牌调用默认的天气预报端点时,我会得到一个HTTP 401未经授权的错误,在WWW-身份验证响应头中有以下内容
“承担者error=”“invalid_token”,error_description=“听众‘api://自动化/TestApi’是无效的”
我遗漏了什么吗?我找不到任何线索来了解观众的期望,也找不到任何明显的控制方法。
按照要求,这里是公开API屏幕的内容。

和我正在使用的解码jwt令牌

更新
下面我试了一下赵嘉的回答,结果没什么用。但是我记得刚才我问了一个问题,是关于错误的发行人的。,其结果是手动编辑API注册中的清单json,并设置"accessTokenAcceptedVersion":2
现在,我得到了一个以v2 guid为受众的clientId函数

但是,使用这个令牌仍然不起作用!!我现在得到一个关于发行者的错误:
Bearer error="invalid_token", error_description="The issuer 'https://login.microsoftonline.com/{{guid}}/v2.0' is invalid
发布于 2020-11-04 22:27:15
我找到了一种更好的方法来做这件事,所以我想把答案作为我第一个答案的替代方案。
我找到了这个非常好的示例应用程序和教程,并完成了第一部分“桌面应用程序调用Web”,并生成了一个api,该api使用正确的端点并在更可预测的庄园中对令牌进行验证。如果您是在一个新的Web上声明,我建议使用它作为起点,而不是VisualStudio支架所使用的API。
要获取脚手架天气预测api以接受令牌(访问令牌)
下面是我的配置服务现在的样子
public void ConfigureServices(IServiceCollection services)
{
services.AddMicrosoftIdentityWebApiAuthentication(Configuration);
services.AddControllers();
}在我的另一个答案中显示的自定义发行者验证器不被重新量化,并且可以被移除。
发布于 2020-10-30 10:26:19
您错过了一些重要的步骤,您的访问令牌也是错误的,它缺乏必要的权限。你可以试着按照我的方法:
您需要创建两个应用程序,一个代表客户机应用程序,另一个代表api应用程序,然后使用客户机应用程序调用Web应用程序。
首先,您需要公开表示web api的应用程序的api,您可以根据以下过程配置它:
Azure portal>App registrations>Expose a API>Add a scope>Add客户端应用程序
由于使用的是客户端凭据流,接下来,需要定义api应用程序的清单,并将应用程序权限授予客户端应用程序(这是您自己定义的角色权限,添加权限时可以在My 中找到).Then,您需要单击管理同意按钮来授予管理员对此权限的同意。
这是定义清单的过程。

这是为了授予客户端应用程序的权限:

最后,您可以为api应用程序请求一个令牌:

解析令牌,您将看到:

发布于 2020-11-02 17:51:48
我已经取得了一些进一步的进展,我将用它来给出我自己的答案。
生成的代码使用Microsoft.AspNetCore.Authentication.AzureAD.UI包v3.1.x验证令牌。
使用Fiddler,我可以看到它使用的是旧的端点,而不是当前的"V2.0“端点。
这的意义在于令牌版本指示在令牌中返回哪些受众和发行者。
在V1令牌中,听众是来自应用程序注册的“应用程序Id Url”,而发行者是"https://sts.windows.net/{tennantId}“
在v2令牌中,用户是应用程序注册的客户机ID (GUID),而发行者是https://login.microsoftonline.com/{tenantId}/V2.0。
根本的问题是,这个库期待的是某种混合令牌,它的受众值为v2.0令牌(例如客户机Id),但来自v1颁发者https://sts.windows.net/。
我找不到办法让它查看v2.0端点来进行配置,但是我在without上找到了一个旧问题数目,这些问题都是在没有解决的情况下关闭的。
特别是
我的解决办法是在应用程序注册中设置"accessTokenAcceptedVersion":2,在应用程序注册上设置“清单”json。这将确保正确的受众在令牌中。
第二步是在启动类的ConfigureServices方法中添加自定义颁发者验证。这是我的密码
AzureADOptions opt = new AzureADOptions();
Configuration.Bind("AzureAd", opt);
string expectedIssuer = $"{opt.Instance}{opt.TenantId}/v2.0";
services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
options.TokenValidationParameters.IssuerValidator = (issuer, securityToken, validationParameters) =>
{
if (issuer == expectedIssuer) return issuer;
throw new SecurityTokenInvalidIssuerException("Invalid Issuer")
{
InvalidIssuer = issuer
};
};
});这确实让人觉得我在讨论错误的中间件和/或错误配置的中间件的根本问题,我不禁认为肯定有更简单的东西--这毕竟是从visual 2019生成的向导生成的初学者代码。
https://stackoverflow.com/questions/64600292
复制相似问题