如何使用 IdentityServer4 保护 API(免受意外调用)?

Posted

技术标签:

【中文标题】如何使用 IdentityServer4 保护 API(免受意外调用)?【英文标题】:How to protect API (from unexpected calls) with IdentityServer4? 【发布时间】:2021-06-20 11:57:51 【问题描述】:

我有一个 3 层 Blazor 应用程序,并使用 IdentyServer 4.1 进行身份验证。

我目前的问题是一些 API 端点没有受到保护,任何应用程序都可以进行这样的调用。

我的理解是 IdentityServer 仅用于经过身份验证的用户的服务器令牌,对吗? 有没有办法确保呼叫来自我的应用程序(网站、移动设备等), 也许有一个令牌......但是如何?

【问题讨论】:

【参考方案1】:

您需要使用 JwtBearer 身份验证来保护您的 Web-Api 端点。

这是您的 Web Api 的 Startup 类中应该包含的代码示例:

Startup.ConfigureServices 方法

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.IdentityModel.Tokens;


services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                .AddJwtBearer(options =>
                
                    options.Authority = "https://localhost:5000";
                    options.Audience = "weatherapi";
                    options.TokenValidationParameters = new TokenValidationParameters()
                    
                        NameClaimType = "name"
                    ;
                );

启动.配置

// Code omitted...

 app.UseCors(config => 
            
                config.AllowAnyOrigin();
                config.AllowAnyMethod();
                config.AllowAnyHeader();
            );

 app.UseAuthentication();

 app.UseAuthorization();

您还需要安装 Microsoft.AspNetCore.Authentication.JwtBearer 包,它添加了 ASP.NET Core 中间件,使应用程序能够接收 OpenID Connect 持有者令牌。

您还需要使用 Authorize 属性或您的控制器来注释受保护的端点,如下所示:

[Authorize]
[ApiController]
[Route("api/[controller]")]
public class WeatherForecastController : ControllerBase


注意:options.Authority = "https://localhost:5000"; 是您的 IdentityServer 项目

请注意,options.Audience = "weatherapi"; 是在 IdentityServer 项目的 Config.cs 文件中设置的,如下所示:

public static IEnumerable<ApiResource> Apis =>
            new ApiResource[]
            
                new ApiResource("weatherapi", "The Weather API")
            ;

public static IEnumerable<Client> Clients =>
            new Client[]
            
                new Client
                
                    ClientId...,
                    
                    AllowedScopes =  "openid", "profile", "email", "weatherapi"  
                ,
            ;

【讨论】:

【参考方案2】:

如果您使用 AddJwtBearer 处理程序保护您的 API,它将保护您的 API,并且仅接受由您的 IdentityServer 颁发的令牌(比较 iss 声明)。

您还可以控制令牌的受众是您的 API。这意味着您的 IdentityServer 可以发布用于不同 API 的令牌(使用 aud 声明)。

只有通过 IdentityServer 私钥签名的令牌才能被接受。该密钥的公共部分会在启动时由您的 API 自动下载。

所以,结论是安全的。

但这只是处理身份验证,然后在验证访问令牌后应用授权检查。

来自 mu 培训课程之一的图片显示了管道是如何构建的:

【讨论】:

以上是关于如何使用 IdentityServer4 保护 API(免受意外调用)?的主要内容,如果未能解决你的问题,请参考以下文章

IdentityServer4 中的 CSRF 保护

IdentityServer4文档- 使用客户端凭据保护 API

IdentityServer4示例之使用ResourceOwnerPassword流程来保护API

IdentityServer4入门四:应用Implicit模式保护网站

如何通过自省验证 IdentityServer4 访问令牌

IdentityServer4 - 如何从另一个 ApiResource 调用一个 ApiResource