脚手架标识后禁用预构建的 Razor UI 页面

Disable prebuilt Razor UI pages after scaffolding identity

在 VS2022 中,我启动了一个新的 Razor 页面项目,并选择了“个人帐户”作为身份验证类型。我发现没有可用于自定义的身份相关代码,因为它们是使用 Razor UI 预构建的。我想自定义页面,所以我按照下面建议的方法生成了页面。

https://docs.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-6.0&tabs=visual-studio&viewFallbackFrom=aspnetcore-2.1

之后,我想在创建管理员帐户后禁用注册页面。我选择了“从项目中排除”到 Register.chtml,如下所示。

令人惊讶的是,我发现当生成的页面被排除时,预建的 Razor UI 页面被自动使用(我仍然可以访问和使用 url /Identity/Account/Register)。如何禁用预构建的 Razor UI 页面?

包含 UI 包时,您选择使用所有包。您可以通过脚手架有选择地禁用页面,然后从 OnGetOnPost 方法返回 NotFoundResult,但这可能很费力。您还可以使用 Authorization 来防止访问页面或文件夹,方法是指定一个永远不会应用于用户的授权策略,或者一个不存在的角色,例如:

[Authorize(Roles ="Does Not Exist")]
public class RegisterModel : PageModel
{
   ...

或者,如果您根本不再需要身份 UI,请从您的应用程序中卸载该包。

您可以添加 app.Map 中间件,如下所示:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseRouting();

    app.Map("/Identity/Account/Register", HandleRequest);
    app.Map("/Identity/Account/Login", HandleRequest);

    static void HandleRequest(IApplicationBuilder app)
    {
        app.Run(async context =>
        {
            context.Response.StatusCode = StatusCodes.Status404NotFound;
            await context.Response.WriteAsync("404 Not Found");
        });
    }

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapRazorPages();
    });
}