OpenIddict实战指南:在.NET Core中构建安全的OAuth 2.0与OpenID Connect服务

深入了解 OpenIddict:实现 OAuth 2.0 和 OpenID Connect 协议的 .NET 库 OpenIddict 是一个强大且易于集成的 .NET 库,专为 OAuth 2.0 和 OpenID Connect 协议的实现而设计。无论你是构建一个简单的认证系统,还是需要支持复杂的授权和认证场景,OpenIddict 都能提供高效的解决方案。通过其与 ASP.NET Core 的深度集成,开发者可以快速实现现代化的身份验证系统,保证系统的安全性和灵活性。通过本文的介绍,你可以快速上手 OpenIddict,在你的应用中实现完整的认证与授权机制,为用户提供安全、可靠的身份验证服务。 阅读详情

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
OAuth2/OIDC实战:用OpenIddict实现.NET Core单点登录系统 *授权服务器(Authorization Server)**:颁发访问令牌。**资源服务器(Resource Server)**:托管受保护资源。**资源所有者(Resource Owner)**:通常是终端用户。动态注册(Dynamic Registration)**客户端(Client)**:请求访问资源的应用。发现(Discovery):动态配置。核心(Core):定义基本功能。客户端凭证模式(服务间通信)标准声明(claims)授权码模式(最安全)隐式模式(逐渐淘汰)UserInfo端点。 阅读详情

相关推荐

OpenIddict实战指南:在.NET中构建OAuth 2.0与OpenID Connect安全认证系统

本文详细介绍了如何在.NET应用中利用OpenIddict框架构建符合OAuth 2.0与OpenID Connect标准的认证授权系统。内容涵盖从快速启动、核心配置到与ASP.NET Core Identity集成、自定义令牌管理及生产环境部署的全流程实战指南,帮助开发者高效实现安全的单点登录与API访问控制。

weixin_29229261的博客 382

OpenIddict 6.4.0实战:构建企业级统一认证与授权中心

本文详细介绍了如何使用OpenIddict 6.4.0构建企业级统一认证与授权中心。通过实战案例展示了从环境配置、核心功能实现到多租户支持、精细化权限控制的全过程,并提供了性能优化、安全实践和微服务集成的专业建议,帮助企业快速部署高性能的授权认证服务。

weixin_26757925的博客 404

OAuth2/OIDC深度集成:基于OpenIddict构建.NET Core企业级认证中心

本文详细介绍了如何基于OpenIddict框架在.NET Core中构建企业级认证中心,实现OAuth2/OIDC协议的深度集成。内容涵盖从核心概念解析、项目搭建、基础配置到多租户支持、分布式会话管理等关键企业级特性的实现,并提供了ASP.NET Core MVC、单页应用及移动端等多种客户端的集成方案,旨在帮助开发者构建安全、可扩展的统一认证与单点登录解决方案。

weixin_29279101的博客 252

通过OpenIddict设计一个授权服务器03-客户凭证流程

通过OpenIddict设计一个授权服务器03-客户凭证流程

qq_36437991的博客 3518

openiddict-samples, OpenIddict的ASP.NET 核心/javascript示例.zip

openiddict-samples, OpenIddict的ASP.NET 核心/javascript示例 OpenIddict.Samples演示如何使用 OpenIddict 和不同 oauth2/openid连接流的内核示例示例。支持需要帮助或者想分享你的想法? 请不要犹豫加入或者问你StackOverflow的问题:Gitte

ABP框架之OpenIddict分布式认证授权学习手册v1.0

快进来,带你入坑~~~

西门子PLC1200 1214C DC/DC/DC 驱动步进电机

控制电机旋转的指令在“指令”中的“工艺”下的“Motion Control”(若出现程序块无法调用情况,则看备注3的第4条),本篇只介绍常用指令(若想学习详细与更多指令,请参考指令手册)。

2301_79553921的博客 1万+

datax web升级springboot3 jdk17

datax web但GitHub上还是springboot2,没有升级过,最近扫漏洞发现spring-core漏洞必须升级到6.x才能解决,这时不得不将springboot升级到3.x,随之而来是jdk、mybatis-plus等等的升级,调整了几天才没问题,痛苦的开发人生~~以上,有疑问欢迎留言。

liyinglong1023的博客 969

RuoYi(分离版) 使用代码生成器添加子模块(idea版)

文章目录准备一、使用代码生成器1.数据库2.导入表并生成代码二、导入代码文件1.新建一个模块2.导入zip代码文件3.模块环境配置添加菜单和访问地址总结 准备 前提要把系统启动起来,部分教程可以参考这边文章若依框架RuoYi前后端分离项目导入IDEA及运行启动 但是完全参考这篇文章还是不能把项目启动起来,因为这篇文章没有说明数据库。 我是用的是本地数据库,采用xampp+Navicat的组合来部署和访问数据库。打开Navicat,连接并创建数据库ry-vue并导入数据脚本ry_20191008.sql,q

dream_coke的博客 1万+

python爬虫入门教程(非常详细)

爬虫指的是一种自动化程序,能够模拟人类在互联网上的浏览行为,自动从互联网上抓取、预处理并保存所需要的信息。爬虫运行的过程一般是先制定规则(如指定要抓取的网址、要抓取的信息的类型等),紧接着获取该网址的HTML源代码,根据规则对源代码进行解析和抽取,最后进行处理和保存。爬虫在实际应用中广泛使用,如搜索引擎、大数据分析、交易数据采集等领域,都需要用到爬虫技术来实现信息的定向采集和处理。

工宗浩生财指南针 2万+

【Unity】ABB CRB 15000 外部引导运动实战:从配置到实时控制

本文详细介绍了ABB CRB 15000协作机器人的外部引导运动(EGM)功能在Unity环境中的实战应用。从RobotStudio配置到Unity实时通信架构,再到EGM运动控制技巧和问题排查,全面解析如何实现机器人的高精度实时控制。通过实际案例展示EGM技术在精密装配等场景中的显著效果,帮助开发者快速掌握这一先进技术。

weixin_29057695的博客 440

Android系统修改驱动固定USB摄像头节点绑定前后置摄像头

Android系统中usb摄像头节点会因为摄像头所接的usb口不同或者usb设备识别顺序不一样而出现每次开机生成的video节点不一样的问题。由于客户app调用摄像头时,需要固定摄像头的节点。因此需要针对前面的情况做处理。

Android系统开发笔记 2247

《大数据最全面试题-Offer直通车》目录

做好这些不用担心试用期不通过:程序员入职新公司如何快速上手项目本人遇到大数据面试题和参考答案(超过1万字精华版)大数据面试英文自我介绍参考(万字长文)大数据运维应用场景面试题汇总及参考答案(持续更新)万字数据仓库面试题及参考答案数据仓库数据质量监控和处理方法最佳实践数据仓库建模方法万字详解Doris的3种数据模型详解和数据仓库每一层的模型选用大数据面试临阵磨枪不知看什么?看这份心理就有底了-大数据常用技术栈常见面试100道题最全Hive面试题2024年(2万字详解)Elasticsearch 面试题及参考答

大模型大数据攻城狮的专栏 2613

【ArcGIS遇上Python】使用add-in向导开发ArcGIS插件(1):add-in工具介绍及安装

文章目录addin介绍addin下载addin安装 addin介绍 ArcGIS从10.0开始支持addin(ArcGIS软件中又叫作加载项)的方式进行插件制作。相对于以往9.x系列,addin的无论是从使用或者编写都更加方便快捷。通过开发语言,可以制作ArcGIS Desktop各个软件模块的插件。 Esri提供了Python加载项向导工具来实现Addin界面的搭建,可以到Esri官网去下载该工具Python加载项向导 。从介绍来看,该设计器要求的最低ArcGIS版本为10.1 ,如下图所示: add

智慧空间实验室 7183

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: APS生产计划排程:从理论到实践的智能优化之路
下一篇: Podman实战指南:从零开始部署你的第一个容器
梁秀红
博客等级 码龄10年 42粉丝 1540原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值