web-dev-qa-db-ja.com

ASP.NET Coreの_Layout.cshtmlのCookieにアクセスする

ログインが成功したときに、認証キーを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にアクセスするための参照が必要であると言います。

提案やアイデアはありますか?

21
Matthias Burger

ASP.NET Coreでは、静的HttpContextの概念はなくなりました。新しいMicrosoft Web Frameworkの依存性注入ルール。ビューに関しては@injectIHttpContextAccessor 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
    }
}
24
Ralf Bönning

だから私は解決策を見つけました、もし誰かがそれを必要とするなら、:

ConfigureServicesのサービスをIHttpContextAccessorに追加します

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

_Layout.csインジェクトIHttpContextAccessor

@inject IHttpContextAccessor httpContextaccessor

でクッキーにアクセスする

@Html.Raw(httpContextaccessor.HttpContext.Request.Cookies["Bearer"])
12
Matthias Burger

依存性注入などは必要ありません。そのようなビューでASP.NET Core 2.0 MVCのCookieにアクセスします。

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

ケースを処理する別の方法があります:ビューコンポーネントを使用します。

これはあなたのケースの簡単な例です:

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)のビューからセッションにアクセスする方法

3
adem caglin

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")
2
Nemi Chand

.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を変更する必要はありませんでした。

0
Robin Wilson