ASP.NET Core集成OIDC认证授权时如何避免创建本地用户副本
核心原因
你选择的「Individual Accounts」项目模板默认集成ASP.NET Core Identity组件,该组件的外部登录逻辑强制要求所有第三方身份源(OIDC、Google等)返回的身份必须绑定到本地数据库存储的用户记录,因此OIDC登录完成后会自动跳转至账户关联页面。
对于不需要本地用户存储、仅需使用OIDC返回令牌完成认证的场景,完全可以移除整套Identity依赖,改用Cookie+OIDC的轻量认证方案,该方案不会影响Razor Pages或MVC的基础运行。
具体调整步骤
1. 清理冗余配置与资源
删除所有和ASP.NET Core Identity、本地用户数据库相关的内容:
- 删除
Program.cs中连接字符串读取、AddDbContext<ApplicationDbContext>、AddDatabaseDeveloperPageExceptionFilter的数据库配置代码 - 删除
AddDefaultIdentity<IdentityUser>().AddEntityFrameworkStores<ApplicationDbContext>()的Identity服务注册代码 - 删除请求管道中开发环境下的
app.UseMigrationsEndPoint()配置 - 不需要Google登录的话,同步删除
AddGoogle相关配置段 - 直接删除项目下
Areas/Identity整个文件夹,该目录存放Identity自带的登录、注册、账户关联等UI页面,移除后不影响基础功能。如果项目没有其他数据库使用需求,可同步卸载Microsoft.AspNetCore.Identity.EntityFrameworkCore、Microsoft.EntityFrameworkCore.SqlServer相关NuGet包。
2. 重新配置认证服务
将原来多段分散的AddAuthentication调用替换为统一配置,显式指定Cookie为默认认证方案(用于在用户浏览器端存储加密的登录会话和令牌,数据不会写入本地数据库),OIDC为默认挑战方案(未登录访问受保护资源时自动跳转至OIDC身份提供者,不会触发本地登录页)。
修改后的完整Program.cs参考:
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.OpenIdConnect; using Microsoft.IdentityModel.Protocols.OpenIdConnect; var builder = WebApplication.CreateBuilder(args); // 注册MVC/Razor Pages基础服务 builder.Services.AddRazorPages(); // 配置认证管道 builder.Services.AddAuthentication(options => { options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.LoginPath = "/signin-oidc"; }) // 如需保留Google登录,取消下方代码注释并补充配置 //.AddGoogle(googleOptions => //{ // googleOptions.ClientId = builder.Configuration["Authentication:Google:ClientId"]; // googleOptions.ClientSecret = builder.Configuration["Authentication:Google:ClientSecret"]; //}) .AddOpenIdConnect(openIdOptions => { openIdOptions.ClientId = "clientId"; openIdOptions.Authority = "authority"; openIdOptions.ResponseType = OpenIdConnectResponseType.Code; openIdOptions.GetClaimsFromUserInfoEndpoint = false; openIdOptions.CallbackPath = "/signin-oidc"; openIdOptions.SaveTokens = true; }); var app = builder.Build(); // 配置HTTP请求管道 if (app.Environment.IsDevelopment()) { // 移除本地数据库迁移端点,无本地数据库需求无需配置 } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.MapRazorPages(); app.MapControllerRoute("default", "{controller=Home}/{action=Index}"); app.Run();
注:.NET 6及以上版本中可直接使用MapControllerRoute配置传统MVC路由,不需要嵌套在UseEndpoints中,两种写法运行效果一致。
效果说明
- 调整后登录流程完全走OIDC协议,跳转至身份提供者完成认证后直接回跳应用,不会再出现本地账户关联提示
- 配置中
SaveTokens = true会自动将id token、access token加密存储在用户浏览器的认证Cookie中,后续可在控制器、Razor页面中直接通过await HttpContext.GetTokenAsync("access_token")获取令牌使用 - 整个认证流程不会在本地数据库写入任何用户记录,完全满足仅用令牌完成授权的需求
- 移除Identity不会影响Razor Pages、MVC的路由、模型绑定、静态资源加载等基础功能。
内容的提问来源于stack exchange,提问作者Hidden
相关产品推荐
相关产品推荐

