identityserver6是.net 6+推荐的官方身份认证服务,替代已废弃的identityserver4;需显式配置client的allowedgranttypes、redirecturis等,客户端推荐使用microsoft.identity.web实现oidc认证。

IdentityServer 6 是当前主流选择,.NET 6+ 应优先用它替代已废弃的 IdentityServer4
IdentityServer4 自 2022 年底已停止维护,IdentityServer6 是官方推荐的继任者,基于 ASP.NET Core 6+ 原生构建,不再依赖 OWIN。如果你项目还在用 IdentityServer4,升级不是可选项——是安全必需项。
关键区别在于:
-
IdentityServer6使用AddIdentityServer()+UseIdentityServer()注册中间件,配置全在Program.cs中完成 - 不再需要
IdentityServerOptions的复杂嵌套配置,而是通过ConfigureServices中的强类型 builder(如services.AddIdentityServer().AddInMemoryClients(...))分层设置 - 默认启用 PKCE,且强制要求
redirect_uri必须显式注册,否则会返回invalid_request
客户端(MVC/Web API)用 Microsoft.Identity.Web 实现 OIDC 认证最省事
.NET 5+ 官方推荐用 Microsoft.Identity.Web 包替代手写 AddOpenIdConnect,它自动处理 token 刷新、作用域协商、跨平台重定向等细节。
典型配置(以 ASP.NET Core MVC 为例):
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration, "AzureAd")
.EnableTokenAcquisitionToCallDownstreamApi(new string[] { "api://your-api-scope" })
.AddInMemoryTokenCaches();
注意几个易错点:
-
"AzureAd"是appsettings.json中配置节名,不是硬编码字符串;节内必须包含Instance、Domain、ClientId、ClientSecret(或证书)、CallbackPath - 若对接自建
IdentityServer6,把Instance换成你的地址(如https://localhost:5001),ClientId必须与 IdentityServer 中Client的ClientId完全一致 -
CallbackPath默认是/signin-oidc,IdentityServer 的RedirectUris列表里必须包含完整 URL(如https://localhost:7001/signin-oidc),少一个斜杠都会报unauthorized_client
IdentityServer6 中 Client 配置必须显式声明 AllowedGrantTypes 和 RedirectUris
常见错误是只配了 ClientId 和 ClientName,结果登录后跳回客户端时报 invalid_redirect_uri 或 unsupported_grant_type。这是因为 IdentityServer6 默认拒绝所有未明确定义的行为。
最小可行的 Client 配置示例(内存模式):
new Client
{
ClientId = "mvc-client",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.Code, // 必须指定,不能留空
ClientSecrets = { new Secret("secret".Sha256()) },
RedirectUris = { "https://localhost:7001/signin-oidc" },
PostLogoutRedirectUris = { "https://localhost:7001/signout-callback-oidc" },
AllowedScopes = { "openid", "profile", "api1" }
}
特别注意:
-
GrantTypes.Code对应 Authorization Code Flow(含 PKCE),这是 Web 应用唯一推荐方式;GrantTypes.Hybrid已不推荐,GrantTypes.Implicit在 IdentityServer6 中默认禁用 -
AllowedScopes必须包含openid,否则 OpenID Connect 协议不成立;若要获取用户信息,还得加profile - 如果客户端是 Blazor WASM,
RedirectUris要写成https://localhost:7001/authentication/login-callback,且需额外配置RequirePkce = true
调试 OIDC 流程时,先看 /connect/authorize 返回的 HTML 是否含 error 参数
OIDC 登录失败往往卡在重定向链第一环:/connect/authorize。直接访问这个地址(带原始请求参数),浏览器会返回带错误提示的 HTML 页面,比如:
error=unauthorized_client&error_description=Invalid+client_id+or+redirect_uri
比抓包或查日志更快定位问题。常见触发条件:
- 客户端发来的
client_id在 IdentityServer 的 Clients 列表中不存在 -
redirect_uri不在该 Client 的RedirectUris集合中(注意协议、端口、路径、末尾斜杠都要完全匹配) - 请求中带了
scope=offline_access,但 Client 未配置AllowOfflineAccess = true - 用了
response_type=code id_token(Hybrid Flow),但 Client 的AllowedGrantTypes没包含GrantTypes.Hybrid
真正难排查的是 HTTPS 与开发环境混合时的证书问题:本地用 https://localhost:5001 但没信任开发证书,导致 HttpClient 内部调用失败,错误却静默吞掉。这时候得在 IdentityServer 的 Startup 中临时启用 options.RequireHttpsMetadata = false(仅限开发)。










