AspNet.Core Identity - не удается войти в систему - PullRequest
1 голос
/ 24 сентября 2019

Вот моя ситуация:

Я работаю над приложением, которое потребует входа пользователя.Для пользовательского интерфейса я создал приложение MVC с локальными учетными записями пользователей.Мне придется расширить Пользователь с помощью свойств, которые всегда были довольно резкими и сухими.Я расширил пользователя и переместил его в проект уровня домена.Я также убрал контекст, который, опять же, довольно резкий и сухой, и я делал это несколько раз раньше.

Тем не менее, Identity Core кажется ... другим.Я бы использовал пользовательский интерфейс по умолчанию, если представления были открыты, но они, кажется, где-то глубоко в пакете Nuget (это другой вопрос, который у меня есть).

Мой контекст наследует класс IdentityDbContext:

public class MyContext : IdentityDbContext<User, IdentityRole, string>, IMyContext

Я регистрирую идентификационные данные в Startup.cs:

        services
            .AddIdentity<User, IdentityRole>()
            .AddEntityFrameworkStores<MyContext>()
            .AddDefaultTokenProviders();


        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddAuthorization();

Я создал AuthorizationManager, который предназначен для работы с чем-либо в домене авторизации.Я ввожу userManager и signInManager:

public AuthorizationManager(UserManager<User> userManager,
    SignInManager<User> signInManager,
    IMapper mapper)
    {
        _signInManager = signInManager;
        _userManager = userManager;
        _mapper = mapper;
    }

А затем Войти в систему пользователя так:

    public async Task<UserDto> LoginUser(UserLoginInput input)
    {
        var user = input.UserNameOrEmail.Contains("@") ? 
            await _userManager.FindByEmailAsync(input.UserNameOrEmail) :
            await _userManager.FindByNameAsync(input.UserNameOrEmail);

        var signInResult = await _signInManager.CheckPasswordSignInAsync(user, input.Password, false);

        return signInResult.Succeeded ?
            _mapper.Map<UserDto>(user) :
            null;
    }

Результат входа в систему дает мне Успешный, но после этого я никогда не смогучтобы получить доступ к этому пользователю или роли, которые они выполняют.Я проверил, есть ли пользователь и роль в базе данных, и существует ли ссылка на UserRole.Но со всем этим я все еще возвращаю нуль:

var user = await _userManager.GetUserAsync(HttpContext.User);

Я подозреваю, что я не совсем подключен к AspNetCores Identity, но после пары дней прохождения этого я не могу точно определить где или почему .Буду признателен за любую помощь или понимание.

Обновление

Не уверен, если это связано, но я также настраиваю Cookie приложения как часть запуска:

        services.ConfigureApplicationCookie(options =>
        {
            options.AccessDeniedPath = "/Authorization/AccessDenied";
            options.Cookie.Name = "MyApplication_Auth";
            options.Cookie.HttpOnly = true;
            options.ExpireTimeSpan = TimeSpan.FromDays(7);
            options.LoginPath = "/Authorization/Login";
            options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
            options.SlidingExpiration = true;
        });

1 Ответ

1 голос
/ 24 сентября 2019

Во-первых, я считаю, что ваш HttpContext.User всегда будет null, если вы не используете атрибут [Authorize].

Во-вторых, я думаю, что ваши настройки cookie выглядят хорошо, но я не вижу, где выВы звоните UseAuthentication():

public void Configure(IApplicationBuilder app, ILoggerFactory loggerfactory) {
    ⋮
    app.UseAuthentication();
    ⋮
}

Ссылка: Настройка служб идентификации

Идентификация активируется путем вызова UseAuthentication.UseAuthentication добавляет промежуточное программное обеспечение для аутентификации в конвейер запросов.

В-третьих, здесь вы можете найти информацию о настройке всех представлений Identity: Создать полный источник идентификатора пользовательского интерфейса

...