2016-08-14 5 views
10

Я пытаюсь сохранить аутентификации ключ в моих печений, когда Логин удалось:печенье доступ в _Layout.cshtml в ASP.NET Ядра

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.

Любые предложения или идеи?

+0

Просто предложить: Вместо того, чтобы доступ к куки в '_Layout.cshtml', я хотел бы использовать вид компонент для обработки вашего дела. Вы можете создать компонент представления и передать значение cookie как свойство модели. –

+0

ничего себе, это хорошо. пока не работает с компонентами представления. Благодарю. Вы хотите добавить ответ с примером здесь? ;) –

ответ

12

В ядре ASP.NET уже нет понятия статического HttpContext. Правила впрыскивания зависимостей в новой Microsoft Web Framework. Что касается взглядов, то существует директива @inject для доступа к зарегистрированным услугам, например IHttpContextAccessor (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 
    } 
} 
+0

да, наконец, я пришел к такому же результату :), но здесь, у меня есть «согласиться» - это работает :) –

+1

@MatthiasBurger - спасибо - мы работали одновременно; счастливое кодирование. –

7

Так что я нашел решение, если кто-то нуждается в нем, тоже:

Добавить в ConfigureServices Услугу для IHttpContextAccessor

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
} 

в ваш _Layout.cs впрыснуть IHttpContextAccessor:

@inject IHttpContextAccessor httpContextaccessor 

доступ к печенье с

@Html.Raw(httpContextaccessor.HttpContext.Request.Cookies["Bearer"]) 
1

Существует другой способ обработки вашего дела: использование компонента вида.

Вот простой пример для случая:

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

Edit для прямого доступа печенье

@using Microsoft.AspNetCore.Http; 

@Context.Request.Cookies.Get("Bearer") 

См How to access session from a view in ASP .NET Core MVC 1.0

1

CookieManager обертку позволяет чтение/запись/обновление/удаление HTTP куки в ядре ASP.NET. он имеет свободный API для удобства использования.

Попробуйте NuGet Packge: https://github.com/nemi-chand/CookieManager

Он имеет два интерфейса ICookie и ICookieManager, который поможет вам играть с HTTP куки в ядре asp.net

просто добавьте CookieManager в Конфигурировать службу в начале до класса

//add CookieManager 
services.AddCookieManager(); 

В Компоновка страницы впрыскивать Cookie Manager

@inject CookieManager.ICookie _httpCookie 

_httpCookie.Get("Bearer") 
0

Вам не нужна инъекция зависимостей или что-то еще. Вы получаете доступ к куки на ASP.NET MVC 2.0 ядра в виду, что, как:

@{ 
Context.Request.Cookies.TryGetValue("Bearer", out string value); 
} 
Смежные вопросы