我尝试在登录成功时将身份验证密钥存储到我的Cookie中:
HttpContext.Response.Cookies.Append("Bearer", accessToken, cookieMonsterOptions);
所以在控制器类中这是有效的。我可以轻松创建和阅读我的cookie。
但现在我想检查,如果存在,请在我的_Layout.cshtml
中读取cookie的值,并显示登录用户的名称 - 或登录链接。
但是如何在部分_Layout.cshtml
?
string value = HttpContext.Request.Cookies.Get("Bearer");
不起作用。它尝试将System.Web
添加到我的使用中,或者说HttpContext是静态的,需要引用才能访问Request
。
有任何建议或想法吗?
答案 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。