.NET Core Identity作为UI取消注册

kof*_*fus 23 c# asp.net-core-mvc .net-core asp.net-core

我想取消.NET Core 2.1 + Identity中的'Register'选项作为UI应用程序.

我当然可以简单地从页面上删除按钮,问题是 - 这样安全吗?

如果不是我的其他选择?我应该使用脚手架来生成注册码然后在那里禁用它吗?

(同样适用于SetPassword等)

谢谢

Mat*_*att 7

不幸的是,其他两个答案是不正确的-问题实际上是指向新的AddDefaultIdentity()扩展,该扩展使用Razor页面提供默认UI。解决该问题的答案不会删除问题中要求的注册功能。

背景

AddDefaultIdentity的工作方式与AddIdentity相似,但是还包括对AddDefaultUI的调用,该调用使您的应用可以访问新的Identity剃刀视图(当前包含28个视图),这些视图位于新的剃刀类库中。请注意,这不是AddDefaultIdentity和AddIdentity之间的唯一区别(请参阅下文)。

为了更改默认视图,您需要覆盖(“脚手架”)项目中的视图,然后可以对其进行修改。如果您不覆盖视图,或者覆盖它们然后删除cshtml文件,则只需返回默认的UI版本!即使您删除了例如注册的链接,如果用户猜到了URL,用户仍然可以导航到默认注册视图。

选项1-替代视图

如果要保留某些默认视图并修改或删除其他默认视图,则可以按以下方式覆盖这些视图(来自此doc):

  1. 右键单击您的项目>添加>新脚手架项目
  2. 在“添加脚手架”对话框的左窗格中,选择“身份”>“添加”
  3. 在“添加身份”对话框中,选择所需的选项

现在,您可以简单地更改已覆盖视图的外观和功能,也可以“删除”该视图以返回404或重定向到其他位置。如果删除此覆盖的视图,则默认用户界面会回来!

如果要覆盖所有视图,此方法可能会很快变得混乱。

选项2-不添加默认用户界面

另一个选择是回到添加身份的旧方法,该方法不会调用AddDefaultUI,缺点是您需要自己添加所有视图。您可以按以下方式执行此操作(从此文档开始 -尽管忽略有关覆盖所有视图的第一行,该行适用于上面的选项1):

//remove this: services.AddDefaultIdentity<IdentityUser>()
//use this instead to get the Identity basics without any default UI:
services.AddIdentity<IdentityUser, IdentityRole>()
    .AddEntityFrameworkStores<ApplicationDbContext>()
    .AddDefaultTokenProviders();

//this assumes you want to continue using razor views for your identity UI
//it specifies areas can be used with razor pages and then adds an 
//authorize filter with a default policy for the folder /Account/Manage and
//the page /Account/Logout.cshtml (both of which live in Areas/Identity/Pages)
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
    .AddRazorPagesOptions(options =>
    {
        options.AllowAreas = true;
        options.Conventions.AuthorizeAreaFolder("Identity", "/Account/Manage");
        options.Conventions.AuthorizeAreaPage("Identity", "/Account/Logout");
    });

//configures the application cookie to redirect on challenge, etc.
services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = $"/Identity/Account/Login";
    options.LogoutPath = $"/Identity/Account/Logout";
    options.AccessDeniedPath = $"/Identity/Account/AccessDenied";
});

//configures an email sender for e.g. password resets
services.AddSingleton<IEmailSender, EmailSender>();
Run Code Online (Sandbox Code Playgroud)

请注意,我并非100%确信第二种方法也没有问题,如上所述,AddDefaultIdentity和AddIdentity之间还有其他区别。例如,后者添加了RoleManager服务,而前者却没有。另外,我不清楚这两种方法在未来是否会得到同样的支持和维护。

如果不确定上述选项的作用(并且有几个小时要杀),则可以查看与较旧的AddIdentity相比的AddDefaultIdentity的来源(也称为AddIdentityCookiesAddIdentityCore)。

选项3-混合方法

当前最好的选择可能是通过以下方式合并前两个:

  1. 设置您的项目以使用默认身份
  2. 脚手架只是您要包括的视图并相应地对其进行编辑
  3. 切换到旧的AddIdentity调用,并包含如选项2中所示的剃须刀选项(根据需要进行调整,具体取决于您所包含的视图

现在,您只拥有所需的视图,它们基于默认的实现,这意味着这些视图的大部分工作已为您完成。

  • 对于99%的人来说,这些不必要的步骤是必须要做的,不确定这些家伙在想什么。这就像回到了旧的webforms magic BS。 (2认同)

poo*_*pro 6

对于ASP.NET网页,这是前面答案的附加内容,其中包括ASP.Net剃须刀网页。我已经将它们分开,好像有人需要它们,而不是彼此混淆。Web页面与Web表单不同,因为它包含的代码背后。

首先,您将编辑页面> _LoginPartial.cshtml

删除线 <li><a asp-page="/Account/Register">Register</a></li>

下一步编辑页面>帐户> Login.cshtml。删除以下内容:

                <div class="form-group">
                <p>
                    <a asp-page="./ForgotPassword">Forgot your password?</a>
                </p>
                <p>
                    <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
                </p>
            </div>
Run Code Online (Sandbox Code Playgroud)

同时删除:

<div class="col-md-6 col-md-offset-2">
    <section>
        <h4>Use another service to log in.</h4>
        <hr />
        @{
            if ((Model.ExternalLogins?.Count ?? 0) == 0)
            {
                <div>
                    <p>
                        There are no external authentication services configured. See <a href="https://go.microsoft.com/fwlink/?LinkID=532715">this article</a>
                        for details on setting up this ASP.NET application to support logging in via external services.
                    </p>
                </div>
            }
            else
            {
                <form asp-page="./ExternalLogin" asp-route-returnUrl="@Model.ReturnUrl" method="post" class="form-horizontal">
                    <div>
                        <p>
                            @foreach (var provider in Model.ExternalLogins)
                            {
                                <button type="submit" class="btn btn-default" name="provider" value="@provider.Name" title="Log in using your @provider.DisplayName account">@provider.DisplayName</button>
                            }
                        </p>
                    </div>
                </form>
            }
        }
    </section>
</div>
Run Code Online (Sandbox Code Playgroud)

现在编辑Login.cshtml.cs后面的代码

去掉:

public IList<AuthenticationScheme> ExternalLogins { get; set; }
Run Code Online (Sandbox Code Playgroud)

同时删除:

// Clear the existing external cookie to ensure a clean login process
        await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

        ExternalLogins = (await _signInManager.GetExternalAuthenticationSchemesAsync()).ToList();
Run Code Online (Sandbox Code Playgroud)

编辑页面>帐户>管理> _ManageNav.cshtml

去掉:

    @if (hasExternalLogins)
{
    <li class="@ManageNavPages.ExternalLoginsNavClass(ViewContext)"><a asp-page="./ExternalLogins">External logins</a></li>
}
Run Code Online (Sandbox Code Playgroud)

接下来,我们将从页面>帐户目录中删除以下文件:

  • ExternalLogin.cshtml
  • ForgotPassword.cshtml
  • ForgotPasswordConfirmation.cshtml
  • Register.cshtml
  • ResetPassword.cshtml
  • ResetPasswordConfirmation.cshtml

从页面>帐户>管理目录中删除以下文件:

  • ExternalLogin.cshtml


gar*_*thb 2

这是执行此操作的官方文档方法。

禁用用户注册

摘自文档:

  • 脚手架身份。包括Account.Register、Account.Login和Account.RegisterConfirmation

    dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
    
    Run Code Online (Sandbox Code Playgroud)
  • 更新 Areas/Identity/Pages/Account/Register.cshtml.cs,以便用户无法从此端点注册:

    public class RegisterModel : PageModel
    {
      public IActionResult OnGet()
      {
        return RedirectToPage("Login");
      }
    
      public IActionResult OnPost()
      {
        return RedirectToPage("Login");
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 更新 Areas/Identity/Pages/Account/Register.cshtml 以与前面的更改保持一致:

    @page
    @model RegisterModel
    @{
        ViewData["Title"] = "Go to Login";
    }
    
    <h1>@ViewData["Title"]</h1>
    
    <li class="nav-item">
        <a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
    </li>
    
    Run Code Online (Sandbox Code Playgroud)
  • 注释掉或删除 Areas/Identity/Pages/Account/Login.cshtml 中的注册链接

  • 更新区域/身份/页面/帐户/注册确认页面。

    • 从 cshtml 文件中删除代码和链接。
    • 从 PageModel 中删除确认码:

      [AllowAnonymous]
      public class RegisterConfirmationModel : PageModel
      {
        public IActionResult OnGet()
        {  
          return Page();
        }
      }
      
      Run Code Online (Sandbox Code Playgroud)

注意:这还会将默认身份数据库上下文添加到您的项目中。如果您已有数据库上下文,请确保删除脚手架添加的数据库上下文。