首页 文章

ASP.NET Core 2.1身份:如何删除默认UI剃刀页面?

提问于
浏览
9

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

当想要自定义URL时,Javier建议使用以下选项之一:使用默认UI的scaffolding元素并自行进行所有必要的自定义 . 使用重定向规则将旧路由指向新路由 . 根本不要使用默认UI .

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

enter image description here

创建项目后,删除默认UI剃刀页面的方法是什么,仍然使用Identity Core?

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

3 回答

  • 5

    使用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>();
    

    solution ,如果将 AddDefaultIdentity 更改回 AddIdentity ,则可以覆盖默认值 . I.E.不包括 .AddDefaultUI() (也不包括UI),你可以编写自己的 .

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

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

    Update:

    我清理了我的答案,详细说明了我最终使用的最终解决方案,删除了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项目 .

    做到这一点,我到目前为止还没有遇到任何问题 .

  • 1

    我赞成了第一个答案,因为它让我在那里得到90%,想要给出其余部分(放在评论中的时间太长了) . 所以你'll want to keep that /Areas/Identity/ folder because it points to your shared folder if you happen to be using the header from the default template, if not it doesn' t,重要的是删除它 . 后端仍将指向 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?}");
    
  • -1

    有点晚了,但有一个更简单的方法 . 您可以添加新的脚手架来覆盖所有内容 . 看看这篇文章enter link description here

相关问题