前言
1.授权(AddAuthorization)
WebhookClient是基于Blazor开发的Web项目,即像客户端,又像服务端,所以认证授权和之前纯后端服务有些不一样,还是一行一行学习吧
这里没有添加授权方案,默认的授权方案是认证登录
之前后端服务都是先认证再授权,为什么这里先授权再认证?
在 ASP.NET Core / Blazor 中,注册顺序看起来是“先授权再认证”,不会影响;真正生效的顺序是中间件执行顺序:先认证(Authentication),再授权(Authorization),确保
[Authorize]能正确读取用户身份。

2.认证(AddAuthentication)
DefaultScheme:系统默认用哪个认证方案读取用户身份(告诉系统“你是谁”)。
DefaultChallengeScheme:当用户未认证访问受保护资源时,用哪个方案触发登录/认证流程(告诉系统“你没登录怎么办”)。
CookieAuthenticationDefaults.AuthenticationScheme:系统默认使用 Cookie 作为用户身份来源,用于读取和验证已登录用户的信息。
OpenIdConnectDefaults.AuthenticationScheme:当用户访问受保护资源但未登录时,系统默认触发 OpenID Connect 流程,让用户登录并获取令牌。

Cookie/OIDC 对比 JWT
-
API 用 JWT Bearer,只验证 Token → 不需要 DefaultScheme / ChallengeScheme
-
Web App 用 OIDC 授权码,需要 Cookie + 登录重定向 → 必须配置 DefaultScheme / ChallengeScheme
| 特性 | Cookie / OIDC | JWT |
|---|---|---|
| 状态 | 有状态,依赖 Cookie | 无状态,每次请求带 Token |
| 用户身份 | 存在服务器 Cookie | 存在 Token 里,解析即可 |
| Challenge(挑战) | 跳转登录页面 | 返回 401 Unauthorized |
| DefaultScheme/ChallengeScheme | 必须配置 | 可省略(JWT 默认就是 Bearer Token) |

3.Cookie认证方案(AddCookie)
ExpireTimeSpan:过期时间。可以通过appsettings.json中配置SessionCookieLifetimeMinutes,没有配置的话默认60分钟
Cookie.Name:存储用户登录状态的 Cookie 名称,确保当前 Webhooks 客户端的身份信息独立,不与其他应用(即使在同一台机器和不同端口)冲突。如果不设置,系统会用 .AspNetCore.Cookies 来存储用户登录信息。
为什么会冲突?
WebApp
- URL:
https://localhost:5045- Cookie 默认名:
.AspNetCore.Cookies- 存储登录用户信息
WebhooksClient
- URL:
https://localhost:5062- Cookie 默认名:
.AspNetCore.Cookies(没改之前)用户同时在两个应用中访问,浏览器发送请求时,会把 Cookie 名称相同的
.AspNetCore.Cookies都带上:
- WebhooksClient 会读取到 WebApp 的 Cookie,认为用户已登录
- 登录信息不匹配 → 出现认证错误或“未授权”

4.OpenID Connect挑战方案(AddOpenIdConnect)
配置OpenID Connect,其实大部分和认证服务中的配置相似
这些是 OIDC 客户端的标准/基础配置,注释都写请求了,我就不一个个过了,建议RequireHttpsMetadata=true,但我们测试环境用的是https,知道这是个隐患就行
为什么客户端和服务端配置大部分相似?
OAuth2 / OIDC 是一个协议
- 服务端(IdentityServer / ID4 / IdP)
- 客户端(Blazor / WebApp / SPA / Console)
都必须 遵守同一套参数 才能通信成功。
所以都会出现:
- clientId
- redirect_uri
- scopes
- response_type=code
- PKCE(code_challenge / code_verifier)
但是 用途不同:
配置项 服务端作用 客户端作用 clientId 识别客户端是谁 告诉服务器“我是谁” redirect_uri 允许哪些回调 告诉服务器“回调到我这里” scopes 允许申请哪些权限 我要申请这些权限 PKCE 校验安全性 生成 PKCE 参数

启动认证服务、webhooks服务、webhook前端,点击登录

跳转到了id4登录页面进行登录操作
这就是OpenID Connect挑战方案,未登录跳转到id4登录
https://localhost:5243/Account/Login?ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3Frequest_uri%3Durn%253Aietf%253Aparams%253Aoauth%253Arequest_uri%253A16E33408E49FACDFCC5CE02F8F21D5829F10276D5443E27474F4C906EFA30003%26client_id%3Dwebhooksclient解码后:
https://localhost:5243/Account/Login?ReturnUrl=/connect/authorize/callback?request_uri=urn:ietf:params:oauth:request_uri:16E33408E49FACDFCC5CE02F8F21D5829F10276D5443E27474F4C906EFA30003&client_id=webhooksclient

登录成功后又跳转回WebhookClient,然后打开控制台,查看Cookie认证方案的名称配置,发现名称都是以.AspNetCore.WebHooksClientIdentity开始
.AspNetCore.WebHooksClientIdentity chunks-2 localhost / 会话 42 ✓ Lax Medium.AspNetCore.WebHooksClientIdentityC1 CfDJ8AiXIMZqjLRDs2az9HQ7eYOpnqu4i_WqnDXBuf4ZbcgIsZfYddA8m_Yido9P-OPk-wrck_0wHzgb7u2bJlY_9ecToPflA9aPHLUDRrRyA... localhost / 会话 4016 ✓ Lax Medium.AspNetCore.WebHooksClientIdentityC2 1urYJZj3zeCnyLKN7DmAdC9q8Bx35csFZes4LhhvC0IQOJepBg_xnnVi87VhYqpLF4cax3gst649_00iR3BcHBOKsMSZYwACUnCO1uXNFGy62e-eEaYl3UXCiWH5qiULZ9_X6RdNVIMsyKngnVuTaHy2Khf5Dy7C8... localhost / 会话 3614 ✓ Lax Medium
Identity 保存“谁登录了”,IdentityC1/C2 保存“登录用户在 Blazor Server 的状态”,是 Blazor Server 的会话机制生成的。
| Cookie 名称 | 作用 | 类型 | 特点 |
|---|---|---|---|
.AspNetCore.WebHooksClientIdentity |
用户会话主标识 | 会话 Cookie | 保存登录状态引用 |
.AspNetCore.WebHooksClientIdentityC1/C2 |
用户状态分片 | 会话 Cookie | 保存 Blazor Circuit 状态 / session 数据,自动拆分 |

📌 创作不易,感谢支持!
每一篇内容都凝聚了心血与热情,如果我的内容对您有帮助,欢迎请我喝杯咖啡☕,您的支持是我持续分享的最大动力!
💬 加入交流群(QQ群):576434538
