首页 > 解决方案 > 如何禁用 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>();

标签: c#asp.net-core-mvcidentity

解决方案


答案在这里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. 但这不是很安全。更好的方法是制作简单的控制台应用程序来注册新用户。

如果您希望能够在本地开发期间注册用户,您也可以编写一个非常简单的控制台应用程序来连接到数据库并填充初始用户列表。毕竟,正如您提到的,注册不是您的应用程序的一部分,所以如果您减少表面攻击区域,那肯定会更好。


推荐阅读