Доступ к файлу 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);
}