Asp.net core 401,仅使用承载令牌在.NET Core 3.1中使用Azure AD进行身份验证

Asp.net core 401,仅使用承载令牌在.NET Core 3.1中使用Azure AD进行身份验证,asp.net-core,authentication,oauth-2.0,jwt,azure-active-directory,Asp.net Core,Authentication,Oauth 2.0,Jwt,Azure Active Directory,我正在尝试使用Azure AD在.NET Core 3.1 API中实现承载令牌(仅限)身份验证 我能够在验证授权\u代码后从Azure AD检索令牌,并且浏览器使用以下内容发回我的重定向URL: {“令牌类型”:“承载”、“作用域”:“User.Read”、“expires\u in:3600”、“ext\u expires\u in:3600”、“访问令牌”:“EwBwA8l6…SzT3qoxGbSMg=”}(缩写) 一旦我有了这个令牌,我应该能够在我的API上直接使用[Authorize]

我正在尝试使用Azure AD在.NET Core 3.1 API中实现承载令牌(仅限)身份验证

我能够在验证
授权\u代码
后从Azure AD检索令牌,并且浏览器使用以下内容发回我的重定向URL:

{“令牌类型”:“承载”、“作用域”:“User.Read”、“expires\u in:3600”、“ext\u expires\u in:3600”、“访问令牌”:“EwBwA8l6…SzT3qoxGbSMg=”}
(缩写)

一旦我有了这个令牌,我应该能够在我的API上直接使用
[Authorize]
属性,并在头中使用承载令牌进行请求吗?当我这样做的时候,我得到了401的回复

我的
ConfigureServices()
中有这个:

在我的错误日志中,我看到的消息是:

“持票人”未经身份验证。失败消息:“没有可用于令牌的SecurityTokenValidator

我在Startup.cs中尝试了许多设置组合,不管怎样,我似乎只能在从Postman调用API时获得401。我可以通过在线找到的代码示例获得Cookie身份验证,但我不希望这样

是否存在令牌加密的问题?我是否尝试使用错误的令牌?或者是否存在其他问题?是否需要在我的应用程序中为AspNetUser等的数据库表设置标识


简而言之,我只是尝试使用Azure AD作为身份验证提供程序生成一个承载令牌,并通过传入承载令牌头来调用我的API。

看起来有点像您尝试在API中使用Microsoft Graph API令牌。(基于此:
“范围”:“User.Read”

您的前端应用程序需要使用API的作用域,而不是User.Read。 这样,它将获得一个用于API的访问令牌。 通过“公开API”部分在API应用程序注册中注册作用域,并在获取令牌时在前端使用完整作用域值

您的后端需要以下配置:

.AddJwtBearer(options =>
{
    // add v2.0 to the end if your API is set to get v2 tokens in its manifest
    options.Authority = "https://login.microsoftonline.com/your-aad-tenant-id";
    options.Audience = "your-api-client-id";
});
这应该是身份验证所需的最低配置。
它将在启动时自动从授权机构中查找签名密钥等。

谢谢。我添加了该范围,重定向现在生成
{“token\u type”:“Bearer”,“scope”:“api://[guid]/Skills.Read”,“expires\u in”:3600,“ext\u expires\u in”:3600,“access\u token”:“ey…xfdf=”}
。将该令牌放入请求头时,我收到错误:签名验证失败。无法匹配密钥。您是否将权限更新为前端使用的AAD租户?:)对不起,我想您丢失了我。:\n我的意思是,在后端身份验证配置中,您是否使用租户id设置了权限?并删除了令牌验证关于参数?哦!我想我现在知道了。我更新了权限URL,一旦更新了,我就得到了一个关于颁发者无效的错误。我设置validateisuer=false,这是可行的(我会修正它,但我只是想让它工作。)非常感谢!
app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseCookiePolicy();
app.UseAuthentication();
app.UseAuthorization();

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});
.AddJwtBearer(options =>
{
    // add v2.0 to the end if your API is set to get v2 tokens in its manifest
    options.Authority = "https://login.microsoftonline.com/your-aad-tenant-id";
    options.Audience = "your-api-client-id";
});