Jak dodać do rejestracji pole UserName Asp.NET Core MVC

0

Cześć,
Zaczynam programowanie w ASP.NET Core MVC i chciałbym dodać do rejestracji pole UserName, które jest domyślnie w tabeli AplicationUser jednak domyslnie jest przypisywany Email, a ja chciałbym aby jednak było wpisywane przez użytkownika, póki co nie chce zmieniać danych logowania tzn. chcę aby został E-mail. Zmieniałem w accountControler w akcji Register

var user = new ApplicationUser { UserName = model.UserName, Email = model.Email };

W RegisterViewModel dodałem również linijki:

[Required]        
        [Display(Name = "Name")]
        public string UserName { get; set; }

no i oczywiście w widoku

<div class="form-group">
                <label asp-for="UserName"></label>
                <input asp-for="UserName" class="form-control" />
                <span asp-validation-for="UserName" class="text-danger"></span>
            </div>

Niestety problem polega na tym, że przy rejestracji owszem widoczne są te pola itd, są dodawane do tabeli Users jak należy, jednak nie można się zalogować później tylko i wyłącznie na konta które przy rejestracji mają UserName. Jeśli usunę UserName przy rejestracji to logowanie przebiega pomyślnie.
Z góry dziękuje za pomoc!

0

Pokaż metodę akcji dla logowania oraz fragment formularza w widoku odpowiedzialnym za logowanie, a nie rejestracje.

0

Widok:

<form asp-route-returnurl="@ViewData["ReturnUrl"]" method="post">
                <h4>Use a local account to log in.</h4>
                <hr />
                <div asp-validation-summary="All" class="text-danger"></div>
                <div class="form-group">
                    <label asp-for="Email"></label>
                    <input asp-for="Email" class="form-control" />
                    <span asp-validation-for="Email" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <label asp-for="Password"></label>
                    <input asp-for="Password" class="form-control" />
                    <span asp-validation-for="Password" class="text-danger"></span>
                </div>
                <div class="form-group">
                    <div class="checkbox">
                        <label asp-for="RememberMe">
                            <input asp-for="RememberMe" />
                            @Html.DisplayNameFor(m => m.RememberMe)
                        </label>
                    </div>
                </div>
                <div class="form-group">
                    <button type="submit" class="btn btn-default">Log in</button>
                </div>

Akcja Logowanie, w kontrolerze są dwie:

 public async Task<IActionResult> Login(string returnUrl = null)
        {
            // Clear the existing external cookie to ensure a clean login process
            await HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);

            ViewData["ReturnUrl"] = returnUrl;
            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Login(LoginViewModel model, string returnUrl = null)
        {
            ViewData["ReturnUrl"] = returnUrl;
            if (ModelState.IsValid)
            {
                // This doesn't count login failures towards account lockout
                // To enable password failures to trigger account lockout, set lockoutOnFailure: true
                var result = await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, lockoutOnFailure: false);
                if (result.Succeeded)
                {
                    _logger.LogInformation("User logged in.");
                    return RedirectToLocal(returnUrl);
                }
                if (result.RequiresTwoFactor)
                {
                    return RedirectToAction(nameof(LoginWith2fa), new { returnUrl, model.RememberMe });
                }
                if (result.IsLockedOut)
                {
                    _logger.LogWarning("User account locked out.");
                    return RedirectToAction(nameof(Lockout));
                }
                else
                {
                    ModelState.AddModelError(string.Empty, "Invalid login attempt.");
                    return View(model);
                }
            }

            // If we got this far, something failed, redisplay form
            return View(model);
        }

Wszędzie do walidacji itd, widać że domyślnie jest ustawiony e-mail więc nie wiem czemu wyskakuje błąd

0

Zobacz, jak wygląda metoda PasswordSignInAsync w klasie ApplicationSignInManager. Prawdopodobnie tam szuka w bazie po Username a nie po mailu.

0
lukaszek016 napisał(a):

Zobacz, jak wygląda metoda PasswordSignInAsync w klasie ApplicationSignInManager. Prawdopodobnie tam szuka w bazie po Username a nie po mailu.

no tak, ale w parametrze przekazuje model.Email, więc według mnie powinno automatycznie przypisywać E-mail

0

Nie kłóć się. Co ma nazwa parametru do tego, jak działa metoda?

Ale masz zrobiłem to za Ciebie:

public virtual async Task<SignInStatus> PasswordSignInAsync(string userName, string password, bool isPersistent, bool shouldLockout)
    {
      if (this.UserManager == null)
        return SignInStatus.Failure;
        
      TUser user = await this.UserManager.FindByNameAsync(userName).WithCurrentCulture<TUser>();
      if ((object) user == null)
        return SignInStatus.Failure;
      if (await this.UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture<bool>())
        return SignInStatus.LockedOut;
      if (await this.UserManager.CheckPasswordAsync(user, password).WithCurrentCulture<bool>())
      {
        IdentityResult identityResult = await this.UserManager.ResetAccessFailedCountAsync(user.Id).WithCurrentCulture<IdentityResult>();
        return await this.SignInOrTwoFactor(user, isPersistent).WithCurrentCulture<SignInStatus>();
      }
      if (shouldLockout)
      {
        IdentityResult identityResult = await this.UserManager.AccessFailedAsync(user.Id).WithCurrentCulture<IdentityResult>();
        if (await this.UserManager.IsLockedOutAsync(user.Id).WithCurrentCulture<bool>())
          return SignInStatus.LockedOut;
      }
      return SignInStatus.Failure;
    }

Ta linia:

TUser user = await this.UserManager.FindByNameAsync(userName).WithCurrentCulture<TUser>();

Jak widzisz już przekazujesz argument userName.

Poza tym zobacz, że metoda ta ma już parametr userName.

0

Dzięki wielkie za pomoc, ja nie zamierzam się kłócić, dopiero zacząłem przygodę z asp.net core i jestem wdzięczny za każdą pomoc. Wiesz tak tylko napisałem jak uważałem, ale przyznaje Ci rację. Mógłbyś mi jeszcze powiedzieć jak znaleźć tą klasę, ponieważ w moim projekcie nigdzie jej nie ma :( wiem, że jest ona składnikiem Microsoft.AspNet.Identity.Owin, ale nie mam zielonego pojęcia jak się do niej dobrać

1 użytkowników online, w tym zalogowanych: 0, gości: 1