我从AzureAD为我的应用获取access_token和id_token,该应用使用OAuth2和隐式流。这是我获取令牌的示例URL:
第一个月
范围是openid https://grap.microsoft.com/user.read
。response_type
是id_token+token
。
我也有一个ASP.NET后端,我想安全。所以我使用Authorize
属性为我的控制器,并发送一个令牌在头部如下:Authentication : "Bearer THE_TOKEN"
。
我在Startup.cs
中的配置看起来像这样:
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = string.Format("https://login.microsoftonline.com/{0}/v2.0/",
"d67853c3-db96-4dac-a37b-f2bfb12b42d1"),
Audience = "8422b3fb-5612-4fdd-a90f-707d7218de57"
});
字符串
从我所读到的,访问令牌应该用于此,id_token不应该离开前端。但在我的情况下,后端的身份验证只能使用id令牌。access_token不能签名Bearer error="invalid_token", error_description="The signature is invalid"
。
在jwt.io上查看 access_token
,我看到代币有不同的受众和发行者。
"aud": "https://graph.microsoft.com",
"iss": "https://sts.windows.net/d67853c3-db96-4dac-a37b-f2bfb12b42d1/",
型
而ID令牌具有以下特性:
"aud": "my_client_id",
"iss": "https://login.microsoftonline.com/my_tenant_id/v2.0",
型
所以在我看来,access_token是为Graph API发布的。如果有人能告诉我,我做错了什么,或者我如何解决我的问题,我会很高兴。
编辑:当我使用scope openid profile
时,它按预期工作。但由于Azure的更改,此scope不再有效,Microsoft指示我使用上述scope。
1条答案
按热度按时间xmd2e60i1#
正如您提到的,您请求的访问令牌是用于Microsoft Graph的。并且id_token仅用于客户端验证用户,而不是用于资源服务器。
要使用Azure AD V2.0端点保护Web API,我们可以获取Web API的访问令牌,如下面的请求:
字符串
下面是通过Azure AD V2.0端点保护Web API的代码:
型
}
有关通过Azure AD V2.0端点保护Web API的更多详细信息,您可以参考下面的文档:
Calling a web API from a .NET web app