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

Blazor如何禁用未投入使用的Account身份验证页面

最优实现方案

不需要scaffold页面也不需要单独配置重定向规则,直接用ASP.NET Core内置的Razor页面路由约定或者路径拦截中间件就能实现,比你提到的两种方案都更简单,也不会产生冗余文件。

方案1:Razor页面路由约定(优先推荐)

直接在服务注册阶段就把需要禁用的Identity页面标记为无效,访问时直接返回404,适配原生路由体系,不需要额外的中间件逻辑:

using System.Net;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Identity;

var builder = WebApplication.CreateBuilder(args);

// 你的原有Identity服务注册逻辑保留,比如AddDefaultIdentity之类的代码不变
builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
    .AddEntityFrameworkStores<ApplicationDbContext>();

builder.Services.AddRazorPages()
    .AddRazorPagesOptions(options =>
    {
        // 把你需要禁用的所有Identity页面路径放到这个列表里批量处理
        var disabledPagePaths = new List<string>
        {
            "/Identity/Account/Manage/ExternalLogins",
            "/Identity/Account/Manage/TwoFactorAuthentication",
            "/Identity/Account/Manage/PersonalData"
        };
        foreach (var pagePath in disabledPagePaths)
        {
            options.Conventions.AddPageRouteFilter(context =>
            {
                if (context.RelativePath.Equals(pagePath, StringComparison.OrdinalIgnoreCase))
                {
                    context.EndpointMetadata.Add(new ProducesResponseTypeAttribute((int)HttpStatusCode.NotFound));
                    return async httpContext => 
                    {
                        httpContext.Response.StatusCode = (int)HttpStatusCode.NotFound;
                        await Task.CompletedTask;
                    };
                }
                return null;
            }, pagePath);
        }
    });

方案2:中间件路径拦截(更简单直观)

如果只是临时禁用少量页面,直接在中间件管道最前面加路径匹配逻辑即可:

var app = builder.Build();

// 放在所有中间件的最前面,命中路径直接返回404
app.UseWhen(context => 
    context.Request.Path.StartsWithSegments("/Identity/Account/Manage/ExternalLogins", StringComparison.OrdinalIgnoreCase)
    || context.Request.Path.StartsWithSegments("/Identity/Account/Manage/TwoFactorAuthentication", StringComparison.OrdinalIgnoreCase),
    appBuilder =>
    {
        appBuilder.Run(async context =>
        {
            context.Response.StatusCode = StatusCodes.Status404NotFound;
            await Task.CompletedTask;
        });
    });

// 你原有的其他中间件逻辑保留,比如UseStaticFiles、UseRouting之类的代码不变

你提到的两种方案的弊端

  • 先scaffold页面再删除内容:会生成大量你不需要的冗余文件,后续ASP.NET Core版本更新时,Identity页面的逻辑变更你还要手动同步维护,完全没必要
  • 配置重定向规则:返回3xx跳转不符合“功能不存在”的语义,而且规则维护成本和上面的方案差不多,没有优势

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:15:03