Я немного новичок в ядре .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?}");
});
}
Надеюсь, я не пропустил ничего сверхъестественного.Любая помощь с благодарностью.
Вот некоторые изображения (добавлены после первоначального поста).Надеюсь, это поможет решить проблему?