【问题标题】:Azure AD send access token to Web APIAzure AD 将访问令牌发送到 Web API
【发布时间】:2019-12-31 17:31:47
【问题描述】:

我正在编写一个由两部分组成的 Web 应用程序,一个是使用 msal.js 用 Ja​​vaScript 编写的前端单页应用程序,一个是用 C# ASP.Net Core 2.2 编写的后端 Web API。我已经通过前端的 msal.js 集成了登录。我将访问令牌作为不记名令牌发送到 Web API。

我想知道如何验证令牌以仅授予登录用户访问权限。我还想知道使用访问令牌是否是正确的前进方式,因为我每次都必须请求一个新的,即使我不会使用它来请求 Microsoft 的 API,它只会用于访问内部数据。

这是所需的流程:

【问题讨论】:

    标签: asp.net-core asp.net-web-api azure-active-directory single-page-application


    【解决方案1】:

    您可以使用标准 ASP.NET Core JWT 身份验证来验证令牌。 我有一篇关于这个主题的文章:https://joonasw.net/view/azure-AD-authentication-aspnet-core-api-part-1

    您需要使用类似这样的方式配置身份验证

    services
                .AddAuthentication(o =>
                {
                    o.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                })
                .AddJwtBearer(o =>
                {
                    o.Authority = Configuration["Authentication:Authority"];
                    o.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
                    {
                        // Both App ID URI and client id are valid audiences in the access token
                        ValidAudiences = new List<string>
                        {
                            Configuration["Authentication:AppIdUri"],
                            Configuration["Authentication:ClientId"]
                        }
                    };
                });
    

    您还需要检查令牌是否包含至少一个有效范围/权限。

    您无需为每次调用获取新令牌,MSAL.js 会在需要时为您处理续订。如果它仍然有效,它只是从缓存中返回它。

    【讨论】:

    • 感谢它的工作,但是,我后来意识到我需要一种不同的方法,因为 Web API 将有多个 Web 应用程序链接到它。这将导致多个客户端 ID、租户 ID 等...访问同一个 Web API。如果客户端不需要使用密钥,这将不是问题,但我不能这样做,因为我的应用程序是一个单页应用程序,它将在 nginx 或 apache 等 Web 服务器上运行。
    • 好吧,为什么你的 API 会有多个 id?您可以在 AAD 中将 API 注册为应用程序,并让客户端应用程序需要对它的权限。然后,如果您需要支持多个租户,您可以将 API 设为多租户,并将其同意到每个租户中。
    • 我的 API 不会有多个 id,不同的 Web 应用程序会有,因为它们将完成不同的任务并分配给它们不同的域。因此,每个 Web 应用程序都将在 AAD 和 API 中注册为自己的应用程序。
    • 你不应该多次注册你的 API,除非你真的想在它们之间有很强的分离。也有实现它的方法,但它会涉及大量的定制工作。通常我们使用相同的 API 注册,所有客户端应用都需要访问它。
    • 我认为您误解了我,我已经提出了一个新问题,因为这超出了原始问题的范围,并且我已经添加了一些说明。 stackoverflow.com/questions/57691531/…
    猜你喜欢
    • 2020-12-21
    • 2023-04-04
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 2019-11-14
    • 2020-08-12
    • 2019-08-31
    • 2019-08-25
    相关资源
    最近更新 更多