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

如何在ASP.NET Core Identity中仅使用部分默认UI并禁用其余页面?

在Razor Pages中精简ASP.NET Core Identity UI的实用方案

我完全懂你的困惑——ASP.NET Core Identity的默认RCL(Razor类库)UI确实附带了一大堆用不上的页面,想要只保留登录、注册这类核心功能,却又不想被冗余代码和无效URL困扰,确实有点头疼。下面我结合实际项目经验,给你梳理几个可行的解决思路:

一、无需全量搭建再禁用:只生成你需要的UI页面

这是最直接高效的方案,不需要先把所有默认UI拉到项目里再删,而是精准生成指定页面:

  1. 首先在Program.cs(.NET 6+)或Startup.cs中添加Identity核心服务,但不要调用AddDefaultUI()——这样默认的RCL UI不会被启用,只有你手动生成的页面才会生效。
    // 示例:添加Identity核心服务,不启用默认UI
    services.AddIdentity<IdentityUser, IdentityRole>()
        .AddEntityFrameworkStores<ApplicationDbContext>()
        .AddDefaultTokenProviders();
    
  2. 使用.NET CLI的代码生成工具,只指定你需要的页面。比如只生成登录和注册页面:
    dotnet aspnet-codegenerator identity -dc YourDbContextName --files "Account.Login;Account.Register"
    
    这样你的项目里只会出现Login.cshtml、Login.cshtml.cs、Register.cshtml、Register.cshtml.cs这些文件,其他默认页面根本不会出现在项目中,自然也就无法通过URL访问到。

二、已启用默认UI?快速禁用不需要的端点

如果已经不小心启用了AddDefaultUI(),也不用慌,不需要逐个搭建页面再禁用,直接通过配置拦截不需要的路由:

方法1:拦截重定向事件(比如禁用注册)

如果你只是想隐藏注册页面,不让用户访问,可以在配置Cookie时拦截跳转:

services.ConfigureApplicationCookie(options =>
{
    // 当系统试图跳转到注册页面时,返回404
    options.Events.OnRedirectToRegister = context =>
    {
        context.Response.StatusCode = StatusCodes.Status404NotFound;
        return Task.CompletedTask;
    };

    // 同理,也可以拦截其他页面,比如AccessDenied、ForgotPassword等
    options.Events.OnRedirectToAccessDenied = context =>
    {
        context.Response.StatusCode = StatusCodes.Status404NotFound;
        return Task.CompletedTask;
    };
});

方法2:用路由配置限制访问

对于一些你不想公开的页面,可以直接修改路由规则,比如移除或重定向:

// 在Configure的路由配置中调整Identity页面路由
app.MapRazorPages()
    .AddRazorPagesOptions(options =>
    {
        // 移除AccessDenied页面的路由,使其无法访问
        options.Conventions.RemovePageRoute("/Identity/Account/AccessDenied");
        // 或者将ForgotPassword页面重定向到自定义页面
        options.Conventions.AddPageRoute("/Identity/Account/ForgotPassword", "/CustomForgotPassword");
    });

三、要不要放弃默认UI自己写?

你提到的“放弃默认UI,自己写逻辑和视图”确实是一种选择,但其实没必要完全从零开始——Identity的核心价值在于它封装了用户认证、密码哈希、令牌管理这些复杂逻辑,你只需要复用这些服务,自己写少量的视图和PageModel代码即可。

比如,你可以只添加AddIdentity()服务,不启用任何默认UI,然后自己写Login页面的视图,在PageModel中调用SignInManager来处理登录逻辑:

public class LoginModel : PageModel
{
    private readonly SignInManager<IdentityUser> _signInManager;

    public LoginModel(SignInManager<IdentityUser> signInManager)
    {
        _signInManager = signInManager;
    }

    [BindProperty]
    public InputModel Input { get; set; }

    public class InputModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [DataType(DataType.Password)]
        public string Password { get; set; }
    }

    public async Task<IActionResult> OnPostAsync()
    {
        if (ModelState.IsValid)
        {
            var result = await _signInManager.PasswordSignInAsync(Input.Email, Input.Password, isPersistent: false, lockoutOnFailure: false);
            if (result.Succeeded)
            {
                return RedirectToPage("/Index");
            }
            ModelState.AddModelError(string.Empty, "Invalid login attempt.");
        }
        return Page();
    }
}

这种方式既保留了Identity的核心能力,又完全掌控了UI和路由,适合对UI有高度定制需求的场景,但如果只是需要基础功能,还是用第一种“精准生成页面”的方案更高效。

总结

  • 优先选择精准生成所需UI页面+不启用默认UI的方案,既能利用Identity的默认实现,又不会有冗余代码;
  • 如果已启用默认UI,通过Cookie事件拦截或路由配置就能快速禁用不需要的端点,无需全量搭建;
  • 自己写UI可行,但没必要重复实现核心逻辑,复用Identity的服务即可。

内容的提问来源于stack exchange,提问作者Duke3e33

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:12:38