kof*_*fus 23 c# asp.net-core-mvc .net-core asp.net-core
我想取消.NET Core 2.1 + Identity中的'Register'选项作为UI应用程序.
我当然可以简单地从页面上删除按钮,问题是 - 这样安全吗?
如果不是我的其他选择?我应该使用脚手架来生成注册码然后在那里禁用它吗?
(同样适用于SetPassword等)
谢谢
不幸的是,其他两个答案是不正确的-问题实际上是指向新的AddDefaultIdentity()扩展,该扩展使用Razor页面提供默认UI。解决该问题的答案不会删除问题中要求的注册功能。
AddDefaultIdentity的工作方式与AddIdentity相似,但是还包括对AddDefaultUI的调用,该调用使您的应用可以访问新的Identity剃刀视图(当前包含28个视图),这些视图位于新的剃刀类库中。请注意,这不是AddDefaultIdentity和AddIdentity之间的唯一区别(请参阅下文)。
为了更改默认视图,您需要覆盖(“脚手架”)项目中的视图,然后可以对其进行修改。如果您不覆盖视图,或者覆盖它们然后删除cshtml文件,则只需返回默认的UI版本!即使您删除了例如注册的链接,如果用户猜到了URL,用户仍然可以导航到默认注册视图。
如果要保留某些默认视图并修改或删除其他默认视图,则可以按以下方式覆盖这些视图(来自此doc):
现在,您可以简单地更改已覆盖视图的外观和功能,也可以“删除”该视图以返回404或重定向到其他位置。如果删除此覆盖的视图,则默认用户界面会回来!
如果要覆盖所有视图,此方法可能会很快变得混乱。
另一个选择是回到添加身份的旧方法,该方法不会调用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的来源(也称为AddIdentityCookies和AddIdentityCore)。
当前最好的选择可能是通过以下方式合并前两个:
现在,您只拥有所需的视图,它们基于默认的实现,这意味着这些视图的大部分工作已为您完成。
对于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)
接下来,我们将从页面>帐户目录中删除以下文件:
从页面>帐户>管理目录中删除以下文件:
这是执行此操作的官方文档方法。
摘自文档:
脚手架身份。包括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 中的注册链接
更新区域/身份/页面/帐户/注册确认页面。
从 PageModel 中删除确认码:
[AllowAnonymous]
public class RegisterConfirmationModel : PageModel
{
public IActionResult OnGet()
{
return Page();
}
}
Run Code Online (Sandbox Code Playgroud)注意:这还会将默认身份数据库上下文添加到您的项目中。如果您已有数据库上下文,请确保删除脚手架添加的数据库上下文。
| 归档时间: |
|
| 查看次数: |
2487 次 |
| 最近记录: |