ログインが成功したときに、認証キーをCookieに保存しようとしています。
HttpContext.Response.Cookies.Append("Bearer", accessToken, cookieMonsterOptions);
したがって、コントローラクラスではこれが機能します。 Cookieを簡単に作成して読み取ることができます。しかし、次に確認し、存在する場合は_Layout.cshtml
のCookieの値を読み取り、ログインしているユーザーの名前またはログインするためのリンクを表示します。しかし、Cookieを部分的に_Layout.cshtml
で読み取るにはどうすればよいですか?
string value = HttpContext.Request.Cookies.Get("Bearer");
動作しません。それはSystem.Web
を私の使用に追加しようとするか、またはHttpContextが静的であり、Request
にアクセスするための参照が必要であると言います。
提案やアイデアはありますか?
ASP.NET Coreでは、静的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
}
}
だから私は解決策を見つけました、もし誰かがそれを必要とするなら、:
ConfigureServices
のサービスをIHttpContextAccessor
に追加します
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
_Layout.cs
インジェクトIHttpContextAccessor
:
@inject IHttpContextAccessor httpContextaccessor
でクッキーにアクセスする
@Html.Raw(httpContextaccessor.HttpContext.Request.Cookies["Bearer"])
依存性注入などは必要ありません。そのようなビューでASP.NET Core 2.0 MVCのCookieにアクセスします。
@{
Context.Request.Cookies.TryGetValue("Bearer", out string value);
}
ケースを処理する別の方法があります:ビューコンポーネントを使用します。
これはあなたのケースの簡単な例です:
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")
CookieManagerラッパーを使用すると、asp.netコアのhttp cookieを読み取り/書き込み/更新/削除できます。それは使いやすさのために滑らかなAPIを持っています。
私のnugetパッケージを試してください: https://github.com/nemi-chand/CookieManager
2つのインターフェイスICookieとICookieManagerがあり、asp.netコアでhttp cookieを操作するのに役立ちます
スタートアップクラスの構成サービスにCookieManagerを追加するだけです
//add CookieManager
services.AddCookieManager();
レイアウトページでCookie Managerを挿入します
@inject CookieManager.ICookie _httpCookie
_httpCookie.Get("Bearer")
.NET Core 2.2では_Layout.cshtmlのCookie値を読み取るためのこれらのメソッドのいずれも機能せず、空白値またはエラーが発生するため、これに約2時間苦労しました。ユーザーが接続しているデータベースの名前を格納するCookieセットがあり、これをWebアプリケーションのフッター(つまり、トレーニングまたはライブ)に表示したい。
機能したのは、_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を変更する必要はありませんでした。