【问题标题】:Secure .Net Core 3 Web API with AAD Token使用 AAD 令牌保护 .Net Core 3 Web API
【发布时间】:2020-06-20 10:26:45
【问题描述】:

由于一些技术限制,我们在用户登录时进行用户名/密码 AAD 身份验证。

用户将他们的用户名和密码输入到我们的自定义登录页面,我们的应用程序调用IPublicClientApplication.AcquireTokenByUsernamePassword。

我打算使用返回的令牌来调用另一个 Web API 应用程序(也连接到同一个 AAD)。在 Web API 应用程序中,我执行了以下操作:

  1. 在启动services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme).AddAzureADBearer(options => Configuration.Bind("AzureAd", options));添加如下代码

  2. 在我的 appsettings.json 文件中包含以下设置
    "AzureAd": { "Instance": "https://login.microsoftonline.com/", "ClientId": "<Application ID>", "TenantId": "<Tenant ID>" }

  3. 使用 [Authorize] 保护我的 Web api

然后,我使用 Postman 根据返回的令牌构造对 Web API 的调用。我包括Authorization: Bearer &lt;JWT Token&gt;。 Web API 返回

Bearer error="invalid_token", error_description="签名无效"

我的问题是

  1. Web API 应用程序可以验证用户名/密码获取的令牌吗?
  2. 如果令牌可以在 Web API 应用程序中验证,由于我收到上述错误,我该怎么做?

【问题讨论】:

  • 您能否检查一下应用程序是否在 AAD 中分配了任何角色?

标签: azure-active-directory asp.net-core-webapi


【解决方案1】:

根据您提供的文档,您正在使用 MSAL 在 Azure AD V2.0 端点中使用资源所有者流获取访问令牌。

从 document 开始,在验证从 Azure AD V2.0 发布的访问令牌时,您应该将 /v2.0 添加到授权:

services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, options =>
{
    // This is a Microsoft identity platform web API.
    options.Authority += "/v2.0";

    // The web API accepts as audiences both the Client ID (options.Audience) and api://{ClientID}.
    options.TokenValidationParameters.ValidAudiences = new []
    {
    options.Audience,
    $"api://{options.Audience}"
    };

});

【讨论】:

  • 感谢您的回复。我添加了设置,现在又收到一个错误“Bearer Error: Invalid Token”。但是每次我拨打电话时,我都会重新生成访问令牌,但仍然会收到错误。
  • @WenHao,你的新错误的详细错误信息是什么?
  • 初始错误信息为 Bearer error="invalid_token", error_description="签名无效" 修改后错误信息为 Bearer error="invalid_token"。无论如何我可以看到完整的错误吗?我打算通读整个教程,看看我的设置和教程设置之间的区别 (github.com/Azure-Samples/…)
  • 使用 fiddler 跟踪响应以找到内部错误消息。
【解决方案2】:

我在自己的网站上测试过,效果不错,可以参考以下步骤:

1.在 azure ad 中注册 Webapi 应用。

2.单击Expose an API 和Add a scope,例如webread.

3.点击Manifest,将accessTokenAcceptedVersion改为2.0。

4.在visual studio webapi ConfigureServices:

services.AddAuthentication(AzureADDefaults.JwtBearerAuthenticationScheme).AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
services.Configure<JwtBearerOptions>(AzureADDefaults.JwtBearerAuthenticationScheme, 
options =>
{
    options.Authority += "/v2.0";
    options.TokenValidationParameters.ValidAudiences = new[]
    {
        options.Audience,
        $"api://{options.Audience}"
    };
});

5.在 azure ad 中注册客户端应用。

6.点击Authentication,将Default client type设置为Yes。

7.点击Api Permission>Add a permission,选择My APIs并选择你之前注册的webapi。

8.在visual studio客户端应用中,使用webread设置范围:

string[] scopes = new string[] { "api://1890e822-xxxxxxxxxxxxxxxx/webread" };

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2014-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-20
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多