如何使用 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文档- 使用客户端凭据保护 API
IdentityServer4示例之使用ResourceOwnerPassword流程来保护API