Вход выполнен успешно, но пользователь не - PullRequest
0 голосов
/ 11 января 2020

У меня есть приложение Blazor WASM. Я использую Identity Framework для входа в систему:

SignInResult signInResult = await signInManager<ApplicationUser>.PasswordSignInAsync(parameters.UserName, parameters.Password, parameters.RememberMe, true);

signInResult всегда Succeeded.

В StateProvider в WebAssembly я получаю объект UserInfo, который, помимо прочего, сообщает, что если пользователь аутентифицирован:

    [HttpGet]
    public UserInfoDto UserInfo()
    {
        return BuildUserInfo();
    }

    private UserInfoDto BuildUserInfo()
    {
        var userInfo = new UserInfoDto
        {
            IsAuthenticated = User.Identity.IsAuthenticated,
            UserName = User.Identity.Name
        };

        foreach (var claim in User.Claims)
        {
            userInfo.ExposedClaims.Add(claim.Type, claim.Value);
        }

        if (userInfo.IsAuthenticated)
        {
            userInfo.Id = Guid.Parse(identityService.GetUserId(User));
        }

        return userInfo;
    }

Здесь User.Identity.IsAuthenticated всегда ложно. Я также проверил это сразу после PasswordSignInAsyn c, но там тоже самое.

Мой запуск настроен следующим образом:

services.AddIdentity<ApplicationUser, ApplicationIdentityRole>()
        .AddEntityFrameworkStores<SupportToolContext>()
        .AddDefaultTokenProviders();

services.Configure<IdentityOptions>(options =>
        {
            // Password settings
            options.Password.RequireDigit = false;
            options.Password.RequiredLength = MIN_PASSWORD_LENGTH;
            options.Password.RequireNonAlphanumeric = false;
            options.Password.RequireUppercase = false;
            options.Password.RequireLowercase = false;

            // Lockout settings
            options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(LOCKOUT_DURATION);
            options.Lockout.MaxFailedAccessAttempts = MAX_TRIES_BEFORE_LOCKOUT;
            options.Lockout.AllowedForNewUsers = true;

            // Email Settings
            options.User.RequireUniqueEmail = true;
            options.SignIn.RequireConfirmedEmail = true;
        });

// Configure LifeSpan of Identity email tokens
services.Configure<DataProtectionTokenProviderOptions>(options =>
        {
            options.TokenLifespan = TimeSpan.FromDays(3);
        });

services.ConfigureApplicationCookie(options =>
        {
            options.Cookie.HttpOnly = false;
            options.Events = new CookieAuthenticationEvents
                             {
                                 OnRedirectToLogin = context =>
                                                     {
                                                         context.Response.StatusCode = UNAUTHORIZED_STATUS_CODE;
                                                         return Task.CompletedTask;
                                                     }
                             };
        });

И метод Configure содержит:

app.UseAuthentication();
app.UseAuthorization();

AuthenticationStateProvider:

publi c class IdentityAuthenticationStateProvider: AuthenticationStateProvider {private UserInfoDto userInfoCache; только для чтения IServiceProvider serviceProvider;

    public IdentityAuthenticationStateProvider(IServiceProvider serviceProvider)
    {
        this.serviceProvider = serviceProvider;
    }

    ..

    private async Task<UserInfoDto> GetUserInfoAsync()
    {
        var authorizeApi = serviceProvider.GetRequiredService<IAuthorizeApi>();

        if (userInfoCache != null && userInfoCache.IsAuthenticated) return userInfoCache;
        userInfoCache = await authorizeApi.GetUserInfoAsync();

        return userInfoCache;
    }

    public override async Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var identity = new ClaimsIdentity();
        try
        {
            UserInfoDto userInfo = await GetUserInfoAsync();
            if (userInfo.IsAuthenticated)
            {
                IEnumerable<Claim> claims = new[] {new Claim(ClaimTypes.Name, userInfoCache.UserName)}.Concat(
                    userInfoCache.ExposedClaims.Select(c => new Claim(c.Key, c.Value)));
                identity = new ClaimsIdentity(claims, "Server authentication");
            }
        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine("Request failed:" + ex);
        }

        return new AuthenticationState(new ClaimsPrincipal(identity));
    }
}

В целом весь процесс идентичен этому примеру: https://github.com/stavroskasidis/BlazorWithIdentity (который также перестал работать локально)

Что смущает Я имею в виду, что он работал раньше и до сих пор работает на сервере, и он не работает локально, если я извлекаю эту историю в точке, развернутой на сервере. Что мне не хватает?

1 Ответ

1 голос
/ 11 января 2020

хорошо, это расстраивает. Решение было перезагрузить весь мой компьютер. Кажется, что проблема была где-то в IIS Express или около того - на обоих моих компьютерах одновременно.

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