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

时间:2018-07-11 15:03:39

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

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

  

Javier建议您选择以下选项之一   自定义网址:

     
      
  • 使用默认UI的scaffolding元素,然后自行进行所有必要的自定义。
  •   
  • 使用重定向规则,将旧路由指向新路由。
  •   
  • 完全不使用默认用户界面。
  •   

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

enter image description here

创建项目后,如何删除“默认UI”剃须刀页面并仍然使用Identity Core?

我可以只删除void validateUserName(String name){ if(!VALID_NAME.equals(name){ throw new BadNameException(); } } 区域,而是创建自己的/Identity/吗?

3 个答案:

答案 0 :(得分:14)

使用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,则可以覆盖默认设置。即不要包含.AddDefaultUI()(也不要搭建UI),并且您可以编写自己的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项目。

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

答案 1 :(得分:2)

我赞成第一个答案,因为它使我有90%的答案,我想把其余的答案全部放弃(发表评论的时间太长了)。因此,您希望保留该/ 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?}");

答案 2 :(得分:1)

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