ASP.NET Core 2.1 Identity:如何删除默认 UI razor 页面?

ASP.NET Core 2.1 Identity: How to remove the Default UI razor pages?

扩展这个问题的答案:

Javier recommends one of the following options when wanting to customise the URLs:

  • Use the scaffolding element of the Default UI and make all necessary customisations yourself.
  • Use a redirection rule that points the old routes to the new routes.
  • Don't use the Default UI at all.

来自一个新的 ASP.NET 核心 2.1 MVC 项目,设置了身份验证:个人用户帐户,你怎么不使用默认 UI?它似乎默认与 Identity Core 一起安装。

项目创建后,有什么方法可以去掉Default UI razor pages,仍然使用Identity Core?

我可以只删除 /Identity/ 区域,然后创建自己的 AccountController 区域吗?

使用 the article linked by Panagiotis Kanavos,我找到了解决方案。

在 ASP.NET Core 2.1.0-preview1 中,有一行 .AddDefaultUI(),您不必将其包含在 Startup.cs 中。

services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultUI()
    .AddDefaultTokenProviders();

然而,在 Core 2.1 的最终发布版本中,同一部分被简化为:

services.AddDefaultIdentity<IdentityUser>()
    .AddEntityFrameworkStores<ApplicationDbContext>();

解决方案,如果您将 AddDefaultIdentity 改回 AddIdentity,您可以覆盖默认值。 IE。不要包含 .AddDefaultUI()(也不要搭建 UI 的脚手架),您可以自己编写。

services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    // .AddDefaultUI()
    .AddDefaultTokenProviders();

然后,我认为删除/Areas/Identity/文件夹是安全的,但我不是100%

更新:

我清理了我的答案以详细说明我最终采用的最终解决方案,以删除 ASP.NET Core 2.1 附带的默认身份 UI razor 页面并改用 MVC。

1) 在Startup.cs,

    public void ConfigureServices(IServiceCollection services)
    {
        // Unrelated stuff commented out...

        // BEGIN: Identity Setup (Overrides default identity)
        services.AddIdentity<ApplicationUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
        // END: Identity Setup

        services.Configure<IdentityOptions>(options =>
        {
            // Set your identity Settings here (password length, etc.)
        });

        // More unrelated stuff commented out...

        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // Added after AddMvc()
        services.ConfigureApplicationCookie(options =>
        {
            options.LoginPath = $"/account/login";
            options.LogoutPath = $"/account/logout";
            options.AccessDeniedPath = $"/account/access-denied";
        });

        // More unrelated stuff commented out...
    }

显然,如果需要,请将 ApplicationUserIdentityRole 替换为您自己的 类。

2) 删除 ASP.NET Core 2.1 项目默认的 Identity 区域文件夹。

3) 创建一个新的单独的 ASP.NET Core 2.0 项目(不是“2.1”),在项目创建 window 中选择 Individual User Account 身份验证。

4) 将 AccountControllerManageController 以及相应的 ViewModelsViews 从 2.0 项目复制到您的 ASP.NET Core 2.1 项目.

通过以上操作,到目前为止我还没有 运行 遇到任何问题。

我对第一个答案投了赞成票,因为它让我获得了 90% 的赞成率,我想给出其余的答案(发表评论有点太长了)。因此,您需要保留 /Areas/Identity/ 文件夹,因为如果您碰巧使用默认模板中的 header,它会指向您的共享文件夹,如果不是,也不要紧,将其删除。后端仍将指向 Identity/Account/Register/,因此创建一个名为 Account 的控制器,在名为 Account 的视图中创建一个文件夹并放置 Register.cshtml。我从调试器 window 中获取了原始 html,您可以将其用作自定义模板。放入 Register.cshtml:

<div class="container body-content">


<h2>Register</h2>

<div class="row">
    <div class="col-md-4">
        <form method="post" action="/Identity/Account/Register" novalidate="novalidate">
            <h4>Create a new account.</h4>
            <hr>
            <div class="text-danger validation-summary-valid" data-valmsg-summary="true"><ul><li style="display:none"></li>
</ul></div>
            <div class="form-group">
                <label for="Input_Email">Email</label>
                <input class="form-control" type="email" data-val="true" data-val-email="The Email field is not a valid e-mail address." data-val-required="The Email field is required." id="Input_Email" name="Input.Email" value="">
                <span class="text-danger field-validation-valid" data-valmsg-for="Input.Email" data-valmsg-replace="true"></span>
            </div>
            <div class="form-group">
                <label for="Input_Password">Password</label>
                <input class="form-control" type="password" data-val="true" data-val-length="The Password must be at least 6 and at max 100 characters long." data-val-length-max="100" data-val-length-min="6" data-val-required="The Password field is required." id="Input_Password" name="Input.Password">
                <span class="text-danger field-validation-valid" data-valmsg-for="Input.Password" data-valmsg-replace="true"></span>
            </div>
            <div class="form-group">
                <label for="Input_ConfirmPassword">Confirm password</label>
                <input class="form-control" type="password" data-val="true" data-val-equalto="The password and confirmation password do not match." data-val-equalto-other="*.Password" id="Input_ConfirmPassword" name="Input.ConfirmPassword">
                <span class="text-danger field-validation-valid" data-valmsg-for="Input.ConfirmPassword" data-valmsg-replace="true"></span>
            </div>
            <button type="submit" class="btn btn-default">Register</button>
        <input name="__RequestVerificationToken" type="hidden" value="CfDJ8IWbPHM_NTJDv_7HGewWzbbRveP09yQOznYdTWL2aN5X_4_eVbNE1w8D_qz7zegloVtdAhuVOJbJLQo0ja73FB3PgYycyGpn-DfX3fJqv4Cx8ns6Ygh6M7nMxV0eozO7hoDxUfPwrIJb2RcFtyzhPpMevZ4P0M8aVyBP55SP-5C4l23dCtDXXUOAY_YLwt67dw"></form>
    </div>
</div>


        <hr>
        <footer>
            <p>© 2018 - SqlServerApp</p>
        </footer>
    </div> 

就像其他答案所说的那样,改变启动:

services.AddIdentity<IdentityUser, IdentityRole>(options => options.Stores.MaxLengthForKeys = 128)
    .AddEntityFrameworkStores<ApplicationDbContext>()
    // .AddDefaultUI()
    .AddDefaultTokenProviders();

还必须创建到您的控制器的路由,相同的 Startup.cs 文件,保留其中的另一条路由,现在我想到它可能首先保留它,因为它会按顺序检查它们:

app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "identity",
                template: "Identity/{controller=Account}/{action=Register}/{id?}");

有点晚了,但有一种更简单的方法。您可以添加新的脚手架来覆盖所有内容。查看 this article