Ядро ASP.NET с Blazor: невозможно определить подлинность cookie
Я пытался следовать этому руководству ( http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/4316/A-Demonstration-of-Simple-Server-side-Blazor-Cookie-Authentication.aspx), чтобы сделать приложение с аутентификацией cookie с помощью ASP.NET Core 3.0 и платформы Blazor v.0.9.0 (последняя версия). Для IDE я использую VS 2019 Preview.
Автор использует более раннюю версию Blazor, но я следовал руководству, используя клиентский проект вместо App, так как они делают одно и то же, я думаю, просто по-разному вызывается в другой версии Blazor.
Вот ссылка на репо с моим результатом: https://github.com/SaintMSent/TestBlazorCookieAuth
Проблема в том, что это не работает. Если я захожу на страницу localhost:port/login, создается cookie (я проверял инструменты Chrome dev). И если я иду на страницу выхода из системы, она удаляется, так что эта часть в порядке. Но другие страницы приложения не будут загружаться. Если я удаляю компонент Login из MainLayout, все загружается нормально, поэтому я думаю, что проблема с HttpContext и HttpContextAccessor в Login.cshtml
Вот как выглядит Login.cshtml
@using System.Security.Claims
@using Microsoft.AspNetCore.Http
@page "/login"
@inject IHttpContextAccessor _httpContextAccessor
@inject HttpClient Http
@if (User.Identity.Name != null)
{
<b>You are logged in as: @User.Identity.Name</b>
<a class="ml-md-auto btn btn-primary"
href="/logout?returnUrl=/"
target="_top">Logout</a>
}
else
{
<a class="ml-md-auto btn btn-primary"
href="/login?returnUrl=/"
target="_top">Login</a>
}
@functions {
private ClaimsPrincipal User;
protected override void OnInit()
{
base.OnInit();
try
{
// Set the user to determine if they are logged in
User = _httpContextAccessor.HttpContext.User;
}
catch { }
}
}
Пожалуйста, помогите мне разобраться, что здесь происходит. Я надеюсь, что предоставил достаточно деталей, спасибо.
ОБНОВЛЕНИЕ: если я добавлю эту строку
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
в Startup.cs в клиентском проекте, все загружается, но _httpContextAccessor.HttpContext.User всегда пусто
2 ответа
Я решил это странным способом. Я создал контроллер с именем AuthController и добавил в него эти методы
[Route("api/[controller]")]
public class AuthController : Controller
{
[HttpGet]
[Route("getlogin")]
public string GetLogin()
{
if (User.Identity.IsAuthenticated)
{
return $"{User.Identity.Name}";
}
return string.Empty;
}
[HttpGet]
[Route("getrole")]
public string GetRole()
{
if (User.Identity.IsAuthenticated)
{
if (User.IsInRole("Admin"))
{
return "Admin";
}
return "User";
}
return string.Empty;
}
}
А потом я вызываю API со стороны клиента, и он отлично работает для меня
Попробуйте сделать это:
Добавьте следующее в Blazor.Web.App.Startup.cs:
services.AddHttpContextAccessor();
Вам также нужно это в <component-name>.cshtml
@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor httpContextAccessor
Изменить: Вы также должны удалить следующее из вашего Server.Startup
// As I've said above, add this to your Client.Startup, and not to the Server.Startup, though at the end of the day it's the same pipeline.
services.AddHttpContextAccessor();
// I'm not sure what is this for. Remove it :)
services.AddScoped<HttpContextAccessor>();
// This is used with Http Client Factory, right now is not supported in client-side blazor; requires some configuration; and in any case an HttpClient object is automatically created for you.
services.AddHttpClient();
// Once again, superfluous, the HttpClient created for you is Singleton
services.AddScoped<HttpClient>();