【问题标题】:Disable prebuilt Razor UI pages after scaffolding identity脚手架标识后禁用预构建的 Razor UI 页面
【发布时间】:2022-01-20 15:28:13
【问题描述】:

在 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 页面?

【问题讨论】:

  • 嗨@newcoder,虽然你没有选择Register.cshtml,但Identity dll文件仍然包含这样的页面。您可以自定义一个中间件在 url 为/Identity/Account/Register 时返回 404,或者您可以自定义 Register.cshtml.cs 文件以在页面处理程序中返回 NotFound()。
  • 请问如何实现中间件?比如通过路由禁用一些url?

标签: asp.net-mvc asp.net-core razor-pages


【解决方案1】:

您可以添加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();
    });
}

【讨论】:

  • 这正是我想要的。但是您的代码有 2 个问题: 1. level1App.Run(async context => ,这会导致警告说缺少 await 运算符并将同步运行 2. 我是否需要为每个 url 重复 app.Map() 代码我要屏蔽?
  • 1.此警告是不可避免的,因为 Run 方法必须使用异步委托,但 HttpContext 不包含用于设置状态代码的异步方法。 2.您可以将.Run()方法移到外面,并在不同的app.Map()中重复使用。我会更新我的答案。
  • 嗨@newcoder,请检查我更新的答案。
  • 那太好了,谢谢
【解决方案2】:

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

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

或者,如果您不再需要 Identity UI,请从您的应用程序中卸载该软件包。

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2021-06-20
    • 2021-04-10
    • 2021-07-25
    • 2019-11-08
    • 2021-11-17
    • 1970-01-01
    • 2019-12-23
    • 2019-10-10
    相关资源
    最近更新 更多