如何保护 Web api 以验证客户端应用程序生成的 openid 令牌?

Posted

技术标签:

【中文标题】如何保护 Web api 以验证客户端应用程序生成的 openid 令牌?【英文标题】:How to secure web api to validate openid token generated by Client application? 【发布时间】:2021-10-28 06:06:17 【问题描述】:

Client app的startup.cs文件中的OpenId Connect配置:

services.AddAuthentication(options =>
            
                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
                options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            )
            .AddCookie()

            .AddOpenIdConnect(options =>
            
                options.ClientId = azureAdConfig.ClientId;
                options.ClientSecret = azureAdConfig.ClientSecret;
                options.Authority = string.Format(com/, azureAdConfig.Tenant);
                options.ResponseType = OpenIdConnectResponseType.CodeIdToken;
                options.Resource = azureAdConfig.ResourceURI_Graph;
                options.Events = new AuthEvents(azureAdConfig, connectionStringsConfig);
            );

我想将令牌传递给 web api。

但是如何保护 web api 并在 api 项目中验证令牌?

【问题讨论】:

【参考方案1】:

我同意大多数文档似乎都专注于网络应用场景。假设您在那里也使用 .Net Core,对于 API,这是使用此包的功能的情况:

Microsoft.AspNetCore.Authentication.JwtBearer
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>

)

有关工作示例,请参阅下面的资源 - 可以使用任何授权服务器以相同的方式编写代码:

Code Doc

AZURE 广告令牌

这些有一些特定的要求。在自定义 API 中要避免的事情是在 JWT 标头中包含 nonce 字段的 JWT,因为它们仅供 Microsoft 自己的 API 使用

我的blog post 提供了一些关于如何解决此问题的详细信息,方法是注册一个逻辑 API 服务来表示一个或多个 API,然后公开您自己的 API 范围。

【讨论】:

感谢您的回答。是否必须在 Azure AD 中创建服务主体才能获得管理员同意才能获得 API 资源的有效令牌? 在我的回答中添加了一些关于 Azure AD 令牌的信息

以上是关于如何保护 Web api 以验证客户端应用程序生成的 openid 令牌?的主要内容,如果未能解决你的问题,请参考以下文章

无法验证从 Azure AD 获得的访问令牌签名以保护 Web API

如何保护 JSF 应用程序客户端和服务器端 REST API 模块

如何使用基本身份验证保护 android/ios 应用程序的 Web API

Web Api OWIN - 如何在每个请求上验证令牌

为公共客户端使用 cookie 保护 Web API 的陷阱

保护 Express API