我有 ASP.NET Core 3.1。我需要暂时阻止新用户注册。
我该怎么做?
我尝试查看注册服务时的选项,但没有看到允许我禁用注册的选项。
services.AddIdentity(options =>
{
});
您可以使用过滤器来阻止对注册页面的请求。此示例过滤器将请求重定向到根路径,但您可以重定向到通知用户已禁用注册的页面。这样您只需添加属性而无需更改任何注册码。
BlockFilter.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
namespace MySite.Filters
{
public class BlockFilter : IAuthorizationFilter
{
public BlockFilter()
{
}
public void OnAuthorization(AuthorizationFilterContext context)
{
if (context == null)
throw new ArgumentNullException(nameof(context));
context.Result = new RedirectResult("/"); //Redirect to you desired page
}
}
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class BlockAttribute : TypeFilterAttribute
{
public BlockAttribute() : base(typeof(BlockFilter))
{
}
}
}
Startup.cs
services.AddControllersWithViews(options =>
{
options.Filters.Add(new BlockAttribute());
});
services.AddRazorPages();
注册.cshtml.cs
[AllowAnonymous]
[Block]
public class RegisterModel : PageModel
{
....
似乎没有这样的选项来禁用注册。但您可以手动进行一些更改。
您可以先搭建两个身份页面:
Account\Register,
Account\Login
。
编辑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>
*@
虽然这些信息可能有点过时,但仍然很有价值。
可以通过以下步骤来限制对 ASP.NET Core Identity 中用户注册的访问:
导航到“ProjectPath\Areas\Identity\Pages\Account\Register.cshtml”文件。
添加条件语句以限制仅对经过身份验证的用户进行访问。否则,显示验证消息。
@if (!User.Identity.IsAuthenticated)
{
<p>Registration is restricted to logged in users.</p>
}
else
{
//Registration form content here
}
接下来,在“ProjectPath\Pages\Shared_LoginPartial.cshtml”视图中,重新定位经过身份验证的代码块中的“注册”链接。此步骤将确保该链接对未经身份验证的用户隐藏
@if (SignInManager.IsSignedIn(User))
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Manage/Index" title="Manage">Hello @User.Identity?.Name!</a>
</li>
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Register">Register</a>
</li>
<li class="nav-item">
<form class="form-inline" asp-area="Identity" asp-page="/Account/Logout" asp-route-returnUrl="@Url.Page("/", new { area = "" })" method="post" >
<button type="submit" class="nav-link btn btn-link text-dark">Logout</button>
</form>
</li>
}
else
{
<li class="nav-item">
<a class="nav-link text-dark" asp-area="Identity" asp-page="/Account/Login">Login</a>
</li>
}