Доступ к файлу cookie в _Layout.cshtml в ASP.NET Core
Я пытаюсь сохранить ключ проверки подлинности в своих файлах cookie при успешном входе в систему:
HttpContext.Response.Cookies.Append("Bearer", accessToken, cookieMonsterOptions);
Итак, в классе контроллера это работает. Я могу легко создавать и читать свои файлы cookie.
Но теперь я хочу проверить и, если он существует, прочитать значение cookie в моем _Layout.cshtml
и показать имя зарегистрированного пользователя - или ссылку для входа.
Но как я могу прочитать свои файлы cookie в частичном _Layout.cshtml
?
string value = HttpContext.Request.Cookies.Get("Bearer");
не работает. Он пытается добавить либо System.Web
в мои приложения, либо говорит, что HttpContext статичен и нуждается в ссылке на доступ Request
.
Любые предложения или идеи?
Ответы
Ответ 1
В ядре ASP.NET уже нет понятия статического HttpContext. Правила впрыскивания зависимостей в новой Microsoft Web Framework. Что касается представлений, существует директива @inject
для доступа к зарегистрированным службам, таким как IHttpContextAccessor
service (https://docs.asp.net/en/latest/mvc/views/dependency-injection.html).
Используя IHttpContextAccessor
, вы можете получить HttpContext
и информацию о файлах cookie, как в этом примере.
@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@{
foreach (var cookie in HttpContextAccessor.HttpContext.Request.Cookies)
{
@cookie.Key @cookie.Value
}
}
Ответ 2
Итак, я нашел решение, если ему это тоже нужно:
Добавьте в ConfigureServices
сервис для IHttpContextAccessor
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
в _Layout.cs
inject IHttpContextAccessor
:
@inject IHttpContextAccessor httpContextaccessor
получить доступ к файлам cookie с помощью
@Html.Raw(httpContextaccessor.HttpContext.Request.Cookies["Bearer"])
Ответ 3
Существует еще один способ обработки вашего дела: использование компонента вида.
Вот простой пример для вашего случая:
LoggedInComponent.cs
:
public class LoggedInComponent: ViewComponent
{
public async Task<IViewComponentResult> InvokeAsync()
{
return View(HttpContext.Request.Cookies.Get("Bearer"));
}
}
Просмотр компонентов:
@model string
@Html.Raw(Model)
_Layout.cshtml
:
@await Component.InvokeAsync("LoggedInComponent")
Также см. https://docs.asp.net/en/latest/mvc/views/view-components.html
Изменить для прямого доступа к файлу cookie
@using Microsoft.AspNetCore.Http;
@Context.Request.Cookies.Get("Bearer")
См. Как получить доступ к сеансу из представления в ASP.NET Core MVC 1.0
Ответ 4
CookieManager обертка позволяет вам читать/писать/обновлять/удалять http cookie в ядре asp.net. он имеет свободный API для упрощения использования.
Попробуйте nuget packge: https://github.com/nemi-chand/CookieManager
Он имеет два интерфейса ICookie и ICookieManager, который помогает вам играть с http cookie в ядре asp.net
просто добавьте CookieManager в службу конфигурации в стартовом классе
//add CookieManager
services.AddCookieManager();
На странице "Макет" введите Менеджер файлов cookie
@inject CookieManager.ICookie _httpCookie
_httpCookie.Get("Bearer")
Ответ 5
Вам не нужна инъекция зависимостей или что-то еще. Вы получаете доступ к файлу cookie на ASP.NET Core 2.0 MVC в виде:
@{
Context.Request.Cookies.TryGetValue("Bearer", out string value);
}