1. 为什么你需要OpenIddict?一个.NET开发者的认证授权新选择
如果你正在用.NET Core开发Web应用或者API,肯定绕不开用户登录和权限控制这档子事。以前我搞项目,要么自己手撸一套基于Cookie或JWT的认证,要么就得去折腾IdentityServer4这类重量级方案。自己写吧,安全性总让人提心吊胆,用现成的吧,配置复杂得让人头大。直到我遇到了OpenIddict,才算是找到了一个既安全又省心的平衡点。
简单来说,OpenIddict就是一个专门为.NET Core设计的OAuth 2.0和OpenID Connect实现框架。它不是什么“开箱即用”的完整产品,而是一个给你提供标准协议支持的“工具箱”。这意味着你不用从零开始造轮子去实现那些复杂的授权流程、令牌管理,但同时又保留了足够的灵活性,可以按照你的业务需求来定制。我印象最深的是它和ASP.NET Core的集成度非常高,基本上就是几行配置代码的事情,就能把一个标准的授权服务器给搭起来,特别适合那些需要快速上线但又对安全性有要求的项目。
你可能听说过OAuth 2.0和OpenID Connect,但总觉得它们概念复杂。我打个比方,OAuth 2.0就像是一套“访客通行证”的发放流程。你去拜访一个高档小区(资源服务器),保安(授权服务器)不会直接给你大门钥匙(用户密码),而是先检查你的身份,然后给你一张有时效的临时门禁卡(访问令牌)。你拿着这张卡才能在小区里访问被允许的区域(受保护的API资源)。而OpenID Connect(OIDC)在这个基础上更进一步,它不仅发通行证,还能验证你的身份证(用户身份信息),告诉你“你是谁”。OpenIddict就是那个帮你轻松搭建起这个“保安亭”和“发卡机”的利器。
那么,OpenIddict最适合谁用呢?我觉得主要是这几类开发者:一是正在构建需要对外提供API服务的后端开发者,你需要一个标准、安全的方式来管理第三方应用的访问权限;二是开发企业内部多个系统,需要实现单点登录(SSO)的架构师;三是任何厌倦了重复编写认证授权代码,希望采用行业标准协议来提升系统安全性和可维护性的.NET工程师。如果你还在用老旧的Forms认证或者自己写的简单Token方案,是时候考虑升级到这套现代标准了。
2. 快速上手:10分钟搭建你的第一个OpenIddict授权服务器
光说不练假把式,咱们直接动手,用最短的时间跑通一个最简单的授权服务器。我保证,即使你之前没接触过OAuth,跟着做也能成功。
首先,用你熟悉的IDE(比如Visual Studio 2022或者VS Code)创建一个新的ASP.NET Core Web API项目。创建好后,打开项目文件(.csproj)或者通过NuGet包管理器,添加OpenIddict的核心包。我习惯用命令行,清晰明了:
dotnet add package OpenIddict.AspNetCore
dotnet add package OpenIddict.EntityFrameworkCore
第一个包是OpenIddict的核心,第二个包是为了用Entity Framework Core来存储令牌、授权码这些数据。是的,OpenIddict支持多种存储方式,内存、数据库都行,但生产环境我强烈建议用数据库持久化。
接下来,打开Program.cs文件,这是.NET Core应用的入口。我们要在这里进行服务配置。别怕代码长,我一步步解释:
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using OpenIddict.Abstractions;
var builder = WebApplication.CreateBuilder(args);
// 1. 先添加数据库上下文,这里我们用内存数据库快速演示,实际项目请换成SQL Server等
builder.Services.AddDbContext<DbContext>(options =>
{
options.UseInMemoryDatabase(nameof(DbContext));
options.UseOpenIddict();
});
// 2. 核心:配置OpenIddict
builder.Services.AddOpenIddict()
// 启用核心服务
.AddCore(options =>
{
// 配置使用Entity Framework Core来存储和查询授权、令牌等信息
options.UseEntityFrameworkCore()
.UseDbContext<DbContext>();
})
// 启用服务器功能(即授权服务器)
.AddServer(options =>
{
// 设置授权和令牌端点的访问路径。`/connect/authorize`和`/connect/token`是OIDC的标准路径。
options.SetAuthorizationEndpointUris("/connect/authorize")
.SetTokenEndpointUris("/connect/token")
.SetUserinfoEndpointUris("/connect/userinfo"); // 用户信息端点
// 允许的授权类型。这里我们启用最常用、最安全的授权码流程。
options.AllowAuthorizationCodeFlow();
// 允许的响应类型。授权码流程对应的是`code`。
options.AllowAuthorizationCodeFlow();
// 注册客户端可以请求的作用域(Scopes)。OpenID是必须的,Profile和Email是常用的用户信息。
options.RegisterScopes(
OpenIddictConstants.Scopes.OpenId,
OpenIddictConstants.Scopes.Profile,
OpenIddictConstants.Scopes.Email);
// 开发环境下的加密和签名证书。**重要警告:生产环境必须替换!**
options.AddDevelopmentEncryptionCertificate()
.AddDevelopmentSigningCertificate();
// 集成ASP.NET Core,并启用端点直通模式,让我们可以用自己的Controller处理请求。
options.UseAspNetCore()
.EnableAuthorizationEndpointPassthrough()
.EnableTokenEndpointPassthrough()
.EnableUserinfoEndpointPassthrough();
})
// 启用验证功能(用于API资源服务器验证令牌)
.AddValidation(options =>
{
options.UseLocalServer(); // 使用本地发行的令牌
options.UseAspNetCore(); // 集成ASP.NET Core认证
});
// 3. 添加基础服务
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// 4. 配置中间件管道
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
// **顺序很重要**:先认证,后授权
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
代码写完了,先别急着运行。我们还需要一个地方来处理/connect/authorize和/connect/token这些端点的具体逻辑。OpenIddict的“直通”模式(Passthrough)允许我们把请求转发到自己的Controller里,这样就能插入自定义的业务逻辑,比如检查用户密码、记录日志等。
创建一个名为AuthorizationController的控制器:
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using OpenIddict.Abstractions;
using OpenIddict.Server.AspNetCore;
using System.Security.Claims;
using static OpenIddict.Abstractions.OpenIddictConstants;
[Ap
382




被折叠的 条评论
为什么被折叠?



