【问题标题】:ASP.NET Core 2.1 Identity: How to remove the Default UI razor pages?ASP.NET Core 2.1 标识:如何删除默认 UI 剃须刀页面?
【发布时间】:2018-12-19 16:34:53
【问题描述】:

扩展这个问题的答案: Change routing in ASP.NET Core Identity UI?

Javier 推荐以下选项之一 自定义 URL:

  • 使用默认 UI 的脚手架元素并自行进行所有必要的自定义。
  • 使用将旧路由指向新路由的重定向规则。
  • 根本不要使用默认用户界面。

在一个新的 ASP.NET Core 2.1 MVC 项目中,设置了身份验证:个人用户帐户,您如何不使用默认 UI?它似乎默认与 Identity Core 一起安装。

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

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

【问题讨论】:

  • 如果你想改变 UI,你唯一需要改变的就是视图。为什么要更改控制器
  • 我更喜欢使用我自己的路线而不是 /Identity/Account/,这似乎不是使用 UI 的推荐选项。
  • 再次为什么?如果您不了解它的作用,“我更喜欢”可能是“它坏了”的前兆。您链接到的问题仅与 Identity UI 包有关。使用它,您不必创建/处理/管理脚手架 UI 使用的 50 多个文件。如果要修改 UI,请不要使用包。您可以使用dotnet aspnet-codegenerator identity -dc WebApplication1.Data.ApplicationDbContext 生成文件并进行修改。
  • 检查ASP.NET Core 2.1.0-preview1: Introducing Identity UI as a library。它解释了 Identity UI 包的作用、创建它的原因以及如何生成剃刀页面以便您可以修改它们。
  • 这不仅仅是路线偏好。我喜欢 MVC 而不是这些新的 Razor 页面。

标签: asp.net asp.net-identity razor-pages asp.net-core-2.1


【解决方案1】:

使用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 剃须刀页面,并改用 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”),在项目创建窗口中选择Individual User Account 身份验证。

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

执行上述操作,到目前为止我还没有遇到任何问题。

【讨论】:

  • 您可能还想配置默认的EmailServiceservices.AddSingleton&lt;IEmailService, EmailService&gt;()
  • 我觉得奇怪的是,当您创建 Angular 应用程序或任何基于 API 的应用程序时,项目模板没有为您提供选择旧控制器样式的选项。无论如何,客户端都在发布数据,因此 几乎 迫使开发人员要么使用 RazorPages 并不必要地覆盖,要么花时间撕掉新的并改装旧的,这样做的好处(我可以看到)较少。难道项目模板不应该帮助我们吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    我赞成第一个答案,因为它让我获得了 90% 的答案,我想给出其余的答案(放入 cmets 有点太长了)。因此,您需要保留该 /Areas/Identity/ 文件夹,因为如果您碰巧使用了默认模板中的标题,它会指向您的共享文件夹,如果不是,请删除它。后端仍将指向Identity/Account/Register/,因此创建一个名为Account 的控制器在名为Account 的视图中创建一个文件夹并将Register.cshtml 放入。我从调试器窗口中获取了原始 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?}");
    

    【讨论】:

      猜你喜欢
      • 2019-01-11
      • 1970-01-01
      • 1970-01-01
      • 2020-04-26
      • 1970-01-01
      • 2020-05-18
      • 1970-01-01
      • 2019-02-14
      • 2018-08-28
      相关资源
      最近更新 更多