在ASP.NET Core中的_Layout.cshtml中访问cookie

时间:2016-08-14 19:08:55

标签: c# asp.net authentication cookies asp.net-core

我尝试在登录成功时将身份验证密钥存储到我的Cookie中:

HttpContext.Response.Cookies.Append("Bearer", accessToken, cookieMonsterOptions);

所以在控制器类中这是有效的。我可以轻松创建和阅读我的cookie。 但现在我想检查,如果存在,请在我的_Layout.cshtml中读取cookie的值,并显示登录用户的名称 - 或登录链接。 但是如何在部分_Layout.cshtml

中读取我的Cookie
string value = HttpContext.Request.Cookies.Get("Bearer");

不起作用。它尝试将System.Web添加到我的使用中,或者说HttpContext是静态的,需要引用才能访问Request

有任何建议或想法吗?

6 个答案:

答案 0 :(得分:22)

在ASP.NET Core中,不再有静态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
    }
}

答案 1 :(得分:10)

所以我找到了解决方案,如果有人需要的话:

ConfigureServices

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

进入_Layout.cs注入IHttpContextAccessor

@inject IHttpContextAccessor httpContextaccessor

使用

访问Cookie
@Html.Raw(httpContextaccessor.HttpContext.Request.Cookies["Bearer"])

答案 2 :(得分:3)

还有另一种处理案例的方法:使用视图组件。

以下是您案例的简单示例:

void OnCollisionEnter(Collision collision) { Debug.Log(collision.contacts[0].normal); } void FixedUpdate() { //use time.fixedDeltaTime }

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

另见https://docs.asp.net/en/latest/mvc/views/view-components.html

编辑以直接访问Cookie

@await Component.InvokeAsync("LoggedInComponent")

请参阅How to access session from a view in ASP .NET Core MVC 1.0

答案 3 :(得分:3)

您不需要依赖注入或其他任何东西。您可以在视图中访问 ASP.NET Core 2.0 MVC 上的cookie:

@{
Context.Request.Cookies.TryGetValue("Bearer", out string value);
}

答案 4 :(得分:2)

CookieManager 包装器允许您在asp.net核心中读取/写入/更新/删除http cookie。它具有流畅的API,易于使用。

试试我的nuget packge:https://github.com/nemi-chand/CookieManager

它有两个界面ICookie和ICookieManager,它可以帮助你在asp.net核心中使用http cookie

只需在启动类

中的configure服务中添加CookieManager
//add CookieManager
services.AddCookieManager();

在布局页面中注入Cookie管理器

@inject CookieManager.ICookie _httpCookie

_httpCookie.Get("Bearer")

答案 5 :(得分:0)

我已经为此苦苦挣扎了大约2个小时,因为在.NET Core 2.2中,这些方法都不适合我读取​​_Layout.cshtml中的cookie值,从而导致空白值或错误。 我有一个Cookie集,用于存储用户连接到的数据库的名称,我想在Web应用程序的页脚(即Training或Live)中显示它。

起作用的是将以下内容添加到_Layout.cshtml的顶部:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor

然后我将其添加到我希望显示cookie值的位置:

@if (@HttpContextAccessor.HttpContext.Request.Cookies.TryGetValue("SystemDatabase", out string SystemDatabase))
{
  @SystemDatabase @:System
}
else
{
  @:Live System
}

现在将打印“实时系统”或“培训系统”。 无需更改Startup.cs。