Мне нужно сохранить имя пользователя и адрес электронной почты отдельно.У меня возникла проблема со входом на сайт после регистрации пользователя - PullRequest
0 голосов
/ 10 апреля 2019

Я создаю новый веб-сайт ASP.NET Core (2.2). По умолчанию имя пользователя и адрес электронной почты - это одно и то же. Я хочу, чтобы они были другими. Проблема возникает, когда я пытаюсь снова войти в систему на веб-странице.

Я создал страницу регистрации личности и внес несколько простых изменений в код, а также в саму страницу Razor (см. Ниже). Я также создал страницу входа в систему, но не думаю, что мне нужно вносить какие-либо изменения, потому что я в порядке, когда люди входят в систему, используя свой адрес электронной почты.

Вот изменения на странице Register.cshtml.cs.

Я добавил это в класс InputModel:

[Required]
[StringLength(256, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 5)]
[DataType(DataType.Text)]
[Display(Name = "User Name")]
public string UserName { get; set; }

Я также изменил пользователя в методе OnPostAsync

var user = new IdentityUser { UserName = Input.UserName, Email = Input.Email };

Все остальное по умолчанию.

На самой странице я просто добавил ее под электронное письмо:

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

Я ожидаю, что пользователь войдет в систему как обычно, увы. Я получаю сообщение об ошибке «Недопустимая попытка входа». Досадно, что пользователь, которого я создал до внесения каких-либо изменений, все еще может войти в систему очень хорошо. Так что моя интуиция говорит мне, что что-то смешное на странице регистрации, я просто не уверен, где.

1 Ответ

0 голосов
/ 11 апреля 2019

Вы должны изменить SignInManager.PasswordSignIn метод. По умолчанию он использует FindByNameAsync, чтобы проверить, существует ли пользователь с данным именем, вы должны изменить на FindByEmailAsync.

  1. Создать новый SignInManager:

    public class MySignInManager : SignInManager<IdentityUser>
    {
        public MySignInManager(Microsoft.AspNetCore.Identity.UserManager<Microsoft.AspNetCore.Identity.IdentityUser> userManager, Microsoft.AspNetCore.Http.IHttpContextAccessor contextAccessor, Microsoft.AspNetCore.Identity.IUserClaimsPrincipalFactory<Microsoft.AspNetCore.Identity.IdentityUser> claimsFactory, Microsoft.Extensions.Options.IOptions<Microsoft.AspNetCore.Identity.IdentityOptions> optionsAccessor, Microsoft.Extensions.Logging.ILogger<Microsoft.AspNetCore.Identity.SignInManager<Microsoft.AspNetCore.Identity.IdentityUser>> logger, Microsoft.AspNetCore.Authentication.IAuthenticationSchemeProvider schemes)
            : base(userManager, contextAccessor, claimsFactory, optionsAccessor, logger, schemes)
        {
        }
    
        public override async Task<SignInResult> PasswordSignInAsync(string userName, string password,
            bool isPersistent, bool lockoutOnFailure)
        {
            var user = await UserManager.FindByEmailAsync(userName);
            if (user == null)
            {
                return SignInResult.Failed;
            }
    
            return await PasswordSignInAsync(user, password, isPersistent, lockoutOnFailure);
        }
    }
    
  2. Зарегистрируйте SignInManager:

    services.AddDefaultIdentity<IdentityUser>()
        .AddDefaultUI(UIFramework.Bootstrap4)
        .AddSignInManager<MySignInManager>()   //register new SignInManager 
        .AddEntityFrameworkStores<ApplicationDbContext>();
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...