在ASP.NET Core中禁用注册模板

21
如何在ASP NET Core 2.2.0+中禁用注册表单?
我不能仅获取并删除适当的模型,因为它不在项目中。根据文档,我了解到这与类似于“ConfigureApplicationPartManager”的东西有关。
此链接here提供更多信息,但我找不到一个适当的示例来禁用它。
目标是禁用新用户的注册,只留下登录\密码表单。
services.AddMvc()
            .ConfigureApplicationPartManager(x =>
            {


                var thisAssembly = typeof(IdentityBuilderUIExtensions).Assembly;
                var relatedAssemblies = RelatedAssemblyAttribute.GetRelatedAssemblies(thisAssembly, throwOnError: true);
                var relatedParts = relatedAssemblies.ToDictionary(
                    ra => ra,
                    CompiledRazorAssemblyApplicationPartFactory.GetDefaultApplicationParts);
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

1
看到了这个:https://damienbod.com/2018/08/07/disabling-parts-of-asp-net-core-identity/ - jazb
4个回答

20

另一个选项是在Startup类中删除注册链接并将其重定向到登录页面:

    app.UseEndpoints(endpoints =>
        {
            endpoints.MapGet("/Identity/Account/Register", context => Task.Factory.StartNew(() => context.Response.Redirect("/Identity/Account/Login", true, true)));
            endpoints.MapPost("/Identity/Account/Register", context => Task.Factory.StartNew(() => context.Response.Redirect("/Identity/Account/Login", true, true)));
        });

15

您可以指定要构建的部分。以下是来自ASP.NET Core文档的摘录。源链接如下。

要禁用用户注册:

  • Scaffold身份验证。包括Account.Register,Account.Login和Account.RegisterConfirmation。例如:
dotnet aspnet-codegenerator identity -dc RPauth.Data.ApplicationDbContext --files "Account.Register;Account.Login;Account.RegisterConfirmation"
  • 更新Areas/Identity/Pages/Account/Register.cshtml.cs,以便用户无法从此端点注册:
public class RegisterModel : PageModel
{
    public IActionResult OnGet()
    {
        return RedirectToPage("Login");
    }

    public IActionResult OnPost()
    {
        return RedirectToPage("Login");
    }
}
  • 更新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>
  • Areas/Identity/Pages/Account/Login.cshtml中,将注册链接注释或删除
@*
<p>
    <a asp-page="./Register" asp-route-returnUrl="@Model.ReturnUrl">Register as a new user</a>
</p>
*@
  • 更新 Areas/Identity/Pages/Account/RegisterConfirmation 页面。
    • 从 cshtml 文件中删除代码和链接。
    • PageModel 中删除确认代码:
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
    public IActionResult OnGet()
    {  
        return Page();
    }
}

来源: https://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-2.2&tabs=visual-studio#disable-register-page

有关dotnet aspnet-codegenerator的更多信息:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/tools/dotnet-aspnet-codegenerator


好的回答!如果你遇到了错误 You intended to execute a .NET program, but dotnet-aspnet-codegenerator does not exist. 那么你需要先通过 dotnet tool install -g dotnet-aspnet-codegenerator 安装它。 - Ogglas

2
对于 ASP.NET Core 3.1 及以上版本,您可以从 Visual Studio GUI 中生成页面。安装 NuGet Microsoft.VisualStudio.Web.CodeGeneration.Design,然后按照以下步骤操作:
  • 在“解决方案资源管理器”中,右键单击项目 > 添加 > 新建脚手架项。
  • 在“添加新的脚手架项”对话框的左窗格中,选择“Identity” > “添加”。
  • 在“添加 Identity”对话框中,选择所需选项。
    • 选择现有的布局页,否则您的布局文件将被覆盖为不正确的标记:
      • Razor Pages 的 ~/Pages/Shared/_Layout.cshtml
      • MVC 项目的 ~/Views/Shared/_Layout.cshtml
      • 从 Blazor Server 模板 (blazorserver) 创建的 Blazor Server 应用程序默认未配置为 Razor Pages 或 MVC。留空布局页条目。
    • 选择 + 按钮创建一个新的数据上下文类。接受默认值或指定一个类(例如 MyApplication.Data.ApplicationDbContext)。
  • 选择“添加”。

https://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-6.0&tabs=visual-studio#scaffold-identity-into-a-razor-project-with-authorization

然后,您可以按照 MS/@Niels R. 的指南操作:

https://dev59.com/BFMI5IYBdhLWcg3wv-XL#58852405

https://learn.microsoft.com/en-us/aspnet/core/security/authentication/scaffold-identity?view=aspnetcore-6.0&tabs=visual-studio#disable-a-page


最佳解决方案,但应用后出现错误MissingMethodException:找不到方法:'Boolean Microsoft.EntityFrameworkCore.Migrations ... 只需要在startup.cs文件的Configure方法中注释掉 app.UseDatabaseErrorPage(); - Mohammad Aldefrawy

2
另一种解决方法是使用中间件,阻止所有特定PageModels的路由。
public class Startup {
    // ...
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // ...
        app.UseRouting();

        var blockedPages = new [] {
            typeof(RegisterModel),
            typeof(RegisterConfirmationModel),
        };
        app.Use(async (context, next) =>
        {
            var pageActionDescriptor = context.GetEndpoint()?.Metadata.GetMetadata<PageActionDescriptor>();
            var page = (pageActionDescriptor as CompiledPageActionDescriptor)?.ModelTypeInfo.BaseType;

            if (blockedPages.Contains(page))
            {
                context.Response.Redirect("/");
                return;
            }
            await next.Invoke();
        });
    }
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接