Как отключить регистрацию для публичной части веб-приложения? - PullRequest
0 голосов
/ 20 октября 2019

У меня есть простое веб-приложение на .NET Core 2.2. Я хотел бы иметь только авторизацию для публичной стороны приложения. Вы можете спросить меня «где я буду брать новых пользователей для моей системы, если у меня будет только авторизация?». Я хотел бы создавать пользователей вручную. С моей точки зрения, эта задача очень проста. Любой веб-фреймворк имеет для этого какой-то функционал. Но я не могу найти цивилизованный способ реализовать это для .NET Core!

Итак, на самом деле у меня есть довольно уродливый способ сделать это. Я только что добавил это промежуточное ПО:

Образец формы Startup.cs file

        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 вместо входа в систему. Но логин работает.

Эта задача проста: создать веб-приложение с авторизацией, но без регистрации (только разработчик может добавлять новых пользователей). Как сделать это для .Net Core?

Я поставил здесь настройки идентичности:

services.AddDefaultIdentity<IdentityUser>()
                .AddDefaultUI(UIFramework.Bootstrap4)
                .AddEntityFrameworkStores<ApplicationDbContext>();

1 Ответ

0 голосов
/ 22 октября 2019

Ответ здесь https://github.com/aspnet/AspNetCore/issues/15207#issuecomment-544648638

Коротко говоря, мне просто нужно изменить файл Register.cshtml.cs. Это здесь:

enter image description here

Моя модификация:

    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. Но это не очень безопасно. Лучше сделать простое консольное приложение для регистрации новых пользователей.

Если вы хотите регистрировать пользователей во время локальной разработки, вы можете написать очень простое консольное приложение, которое подключается к БД изаполняет начальный список пользователей. В конце концов, как вы упомянули, регистрация не является частью вашего приложения, поэтому, если вы уменьшите площадь наземной атаки, это определенно лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...