c# - 如何禁用 Web 应用程序公共端的注册?
问题描述
我在 .NET Core 2.2 上有简单的 Web 应用程序。我只想获得应用程序公共方面的授权。你可以问我“如果我只有授权,我将把新用户带到哪里?”。我想手动创建用户。在我看来,这个任务非常简单。任何网络框架都有一些功能。但是我找不到为 .NET Core 实现它的文明方式!
所以,实际上我有很丑陋的方法来做到这一点。我刚刚添加了这个中间件:
样本表格Startup.cs
文件
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
// disable registration if not Local environment
app.Use(async (context, next) =>
{
if (env.IsEnvironment("Local"))
{
await next.Invoke();
}
else
{
if (context.Request.Path.ToString().Contains("Register") ||
context.Request.Path.ToString().Contains("ForgotPassword"))
{
await context.Response.WriteAsync("Registration is closed");
}
else
{
await next.Invoke();
}
}
});
如您所见,如果环境是本地的 - 我可以注册一个新用户。否则 - 注册已关闭。
我知道这种方式不好,我已经开始研究如何让它变得更好。我的计划是覆盖AcountController
和用户注册方法的附加条件。我知道有这个仪器ms 文档。它可以生成身份脚手架。但它不能生成AccountController
!只有意见。我尝试AccountController
手动制作,但没有成功。我给你看:
public class AccountController : Controller
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
public AccountController(SignInManager<IdentityUser> signInManager, UserManager<IdentityUser> userManager)
{
_signInManager = signInManager;
_userManager = userManager;
}
[HttpGet]
public IActionResult Login()
{
return NotFound();
}
}
我希望上面的代码关闭登录并为我制作 404 而不是登录。但是登录有效。
这个任务很简单:制作有授权但没有注册的 Web 应用程序(只有开发人员可以添加新用户)。如何为 .Net Core 制作它?
我把身份设置放在这里:
services.AddDefaultIdentity<IdentityUser>()
.AddDefaultUI(UIFramework.Bootstrap4)
.AddEntityFrameworkStores<ApplicationDbContext>();
解决方案
答案在这里https://github.com/aspnet/AspNetCore/issues/15207#issuecomment-544648638
简而言之,我只需要修改Register.cshtml.cs
文件。它在这里:
我的修改是:
public IActionResult OnGet()
{
if (!_hostingEnvironment.IsEnvironment("Local"))
{
return RedirectToPage("/Account/Login");
}
return RedirectToPage("/Account/Register");
}
public async Task<IActionResult> OnPostAsync(string returnUrl = null)
{
returnUrl = returnUrl ?? Url.Content("~/");
if (ModelState.IsValid && _hostingEnvironment.IsEnvironment("Local"))
{
var user = new IdentityUser { UserName = Input.Email, Email = Input.Email };
var result = await _userManager.CreateAsync(user, Input.Password);
if (result.Succeeded)
{
_logger.LogInformation("User created a new account with password.");
var code = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Page(
"/Account/ConfirmEmail",
pageHandler: null,
values: new { userId = user.Id, code = code },
protocol: Request.Scheme);
await _emailSender.SendEmailAsync(Input.Email, "Confirm your email",
$"Please confirm your account by <a href='{HtmlEncoder.Default.Encode(callbackUrl)}'>clicking here</a>.");
await _signInManager.SignInAsync(user, isPersistent: false);
return LocalRedirect(returnUrl);
}
foreach (var error in result.Errors)
{
ModelState.AddModelError(string.Empty, error.Description);
}
}
// If we got this far, something failed, redisplay form
return Page();
}
现在我可以注册一个新用户,如果我的环境是Local
. 但这不是很安全。更好的方法是制作简单的控制台应用程序来注册新用户。
如果您希望能够在本地开发期间注册用户,您也可以编写一个非常简单的控制台应用程序来连接到数据库并填充初始用户列表。毕竟,正如您提到的,注册不是您的应用程序的一部分,所以如果您减少表面攻击区域,那肯定会更好。
推荐阅读
- r - 迭代选择并在 R 中选择后删除值
- android - 在android studio中将反编译的apk源导入为android项目
- node.js - 未使用 Twilio 节点服务器发起来电(未发送 VoIP 通知) - 已修复
- javascript - 如何在点击发布请求时以双引号传递变量
- python - 访问列表中元组的值
- python - 在预训练模型的开头添加归一化层
- github-pages - Github 托管域适用于 https:// 但不适用于 http://
- python - AttributeError:“NoneType”对象没有属性“attrs”,尝试了 try-except 方法
- python - 如何进行关键字搜索并将所选列中存在的关键字列出到熊猫数据框的新列?
- python - 如何计算“FTR”列中“H”的数量