User.Identity.IsAuthenticated Проверяется дважды? - PullRequest
0 голосов
/ 28 ноября 2018

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

Однако я настроилмое приложение для использования Jwt и [Авторизация] при работе с любыми конечными точками API.Поскольку это не одностраничное приложение, мне также необходимо разрешить доступ к определенным представлениям в приложении.Например, я хочу, чтобы пользователям был предоставлен доступ к информационной панели приложения, только если они вошли в систему.

Мой метод входа (из псевдо описания) проверяет учетные данные и генерирует маркер JWT для возврата кна стороне клиента для хранения, если все проверено.Перед возвратом токена клиенту я также звоню по следующему номеру:

await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, User);

, который работает по большей части.Он создает cookie и сохраняет информацию в cookie, но когда он попадает в контроллер, где я хочу проверить, прошел ли пользователь проверку подлинности, проверка запускается дважды.При первом запуске isAuthenticated имеет значение false.Во второй раз это работает, это правда.У меня возникают проблемы с выяснением, почему он запускается дважды (может, я что-то здесь упустил?), И начинаю задумываться, правильно ли я к этому подхожу.

public IActionResult Dashboard()
{
    bool isAuthenticated = User.Identity.IsAuthenticated;

    return isAuthenticated ? View() : (IActionResult)Forbid();
}

Моя авторизация Jwt работает простохорошо, но моя авторизация на куки не работает вообще.Например, метод Authorize в приведенном ниже методе работает безупречно.

[Authorize]
public OkObjectResult Test()
{
    return Ok(HttpStatusCode.OK);
}

Вот мой Startup.cs ConfigureServices

    public void ConfigureServices(IServiceCollection services)
    {

        services.AddAuthorization(auth =>
        {
            auth.AddPolicy("Bearer", new AuthorizationPolicyBuilder()
                .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme‌​)
                .RequireAuthenticatedUser().Build());
        });

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => 
        {

            options.LoginPath = "/Home/Index";
            options.AccessDeniedPath = "/Home/Index";
            options.Cookie.Name = CookieAuthenticationDefaults.AuthenticationScheme;
            options.ExpireTimeSpan = new TimeSpan(365, 0, 0, 0);
            options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
            options.Cookie.SameSite = SameSiteMode.None;

        })
        .AddJwtBearer(options =>
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateAudience = false,
                //ValidAudience = "the audience you want to validate",
                ValidateIssuer = false,
                //ValidIssuer = "the issuer you want to validate",

                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("XXX")),

                ValidateLifetime = true, //validate the expiration and not before values in the token

                ClockSkew = TimeSpan.FromMinutes(5) //5 minute tolerance for the expiration date
            };
        });

        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.Secure = CookieSecurePolicy.SameAsRequest;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc(options => 
        {
            options.Filters.Add(new RequireHttpsAttribute());
        })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        // Configure the DB Access.
        services.AddDbContext<DbAccess>(options => 
                    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        // Ensure that we are adding the repos to our scope.
        services.AddScoped<IResetRepository, ResetRepository>();
        services.AddScoped<IAuthRepository, AuthRepository>();

        // Inject our email settings.
        services.Configure<EmailSettings>(Configuration.GetSection("EmailSettings"));

        // Let's set up the email sender as transient.
        services.AddTransient<IEmailSender, EmailSender>();
    }

А вот мой метод Configure в Startup.cs

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            app.UseHsts();
        }

        var cookiePolicyOptions = new CookiePolicyOptions
        {
            Secure = CookieSecurePolicy.SameAsRequest,
            MinimumSameSitePolicy = SameSiteMode.None
        };

        app.UseCookiePolicy(cookiePolicyOptions);

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

Надеюсь, я не пропустил ничего сверхъестественного.Любая помощь с благодарностью.

Вот некоторые изображения (добавлены после первоначального поста).Надеюсь, это поможет решить проблему?First pass where IsAuthenticated is false

Second pass where IsAuthenticated is true and there are claims present.

...