我目前正在开发一个Kiosk终端,我需要使用Azure AD为使用asp.net核心构建的REST API授予UWP应用程序的访问权限.由于没有用户,因为它是一个自助服务终端设置,我创建了一个Azure AD应用程序注册(Web应用程序),并创建了一个用作客户端密钥的密钥.
我设法使用POST请求获取持有者访问令牌https://login.microsoftonline.com/{myTenant}/oauth2/token,提供ClientId,ClientSecret和所需资源(=我的应用注册的AppId).
在我的asp.net核心应用程序中,我确实启用了JWTBearerAuthentication,如下所示:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = Configuration["ClientAuthentication:AADInstance"] + Configuration["ClientAuthentication:TenantId"],
Audience = Configuration["ClientAuthentication:Audience"]
});
我在API控制器中使用Authorize属性.
在这个设置中我总是得到一个
401 unauthorized
在Authorization标头中使用Bearer令牌调用此API时.
有任何想法吗?
最佳答案 代码示例仅用于检查代码问题,因为我无法重现此问题.
这是我的尝试:
>从Azure经典门户注册应用程序
>使用如下的客户端凭据流获取令牌:
//7f39bae4-f852-41ae-8a7b-54d022cf65bd is the client_id of app
POST:https://login.microsoftonline.com/{tenantId}/oauth2/token
grant_type=client_credentials&client_id=7f39bae4-f852-41ae-8a7b-54d022cf65bd&client_secret={clientSecret}&resource=7f39bae4-f852-41ae-8a7b-54d022cf65bd
>克隆here的代码示例
>将Startup类修改为您提供的代码
app.UseJwtBearerAuthentication(new JwtBearerOptions {
Authority = String.Format(Configuration["AzureAd:AadInstance"], Configuration["AzureAD:Tenant"]),
Audience = "7f39bae4-f852-41ae-8a7b-54d022cf65bd"
});
>运行ToDoListService项目
>设置TodoListController的Get方法的断点
>使用Fiddler发送请求,如下所示
GET:https://localhost:44321/api/TodoList
Authorization: bearer {accessToken}
破发点对我来说很好.请确保观众是您应用的客户ID.如果您仍有问题,我建议您按照上述步骤检查是否有帮助.