You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:27:22