wake-up-neo.net

zugriff auf Cookie in _Layout.cshtml in ASP.NET Core

Ich versuche, einen Authentifizierungsschlüssel in meinen Cookies zu speichern, wenn die Anmeldung erfolgreich war:

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

In der Controller-Klasse funktioniert das also. Ich kann meine Cookies leicht erstellen und lesen. Aber jetzt möchte ich den Wert eines Cookies in meinem _Layout.cshtml überprüfen und wenn es existiert, den Namen des angemeldeten Benutzers anzeigen - oder den Link zum Anmelden. Aber wie Ich habe meine Cookies im partiellen _Layout.cshtml gelesen?

string value = HttpContext.Request.Cookies.Get("Bearer");

funktioniert nicht Es versucht entweder System.Web zu meinen Usings hinzuzufügen oder sagt, dass HttpContext statisch ist und einen Verweis benötigt, um auf Request zuzugreifen.

Anregungen oder Ideen?

13
Matthias Burger

In ASP.NET Core gibt es kein Konzept eines statischen HttpContext mehr. Abhängigkeitsinjektionsregeln im neuen Microsoft Web Framework. In Bezug auf Ansichten gibt es die @inject-Direktive für den Zugriff auf registrierte Dienste wie IHttpContextAccessor ( https://docs.asp.net/de/latest/mvc/views/dependency-injection.html ).

Mit IHttpContextAccessor erhalten Sie die HttpContext und die Cookie-Informationen wie in diesem Beispiel.

 @inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor

 @{
    foreach (var cookie in HttpContextAccessor.HttpContext.Request.Cookies)
    {
        @cookie.Key  @cookie.Value
    }
}
19
Ralf Bönning

Also habe ich die Lösung gefunden, wenn jemand sie auch braucht:

Fügen Sie in ConfigureServices den Dienst für IHttpContextAccessor hinzu.

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

in Ihren _Layout.cs injizieren IHttpContextAccessor:

@inject IHttpContextAccessor httpContextaccessor

zugriff auf die Cookies mit

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

Sie brauchen keine Abhängigkeitsinjektion oder sonst etwas. Sie greifen auf das Cookie in ASP.NET Core 2.0 MVC in der Ansicht zu:

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

Es gibt eine andere Möglichkeit, mit Ihrem Fall umzugehen: die Ansichtskomponente.

Hier ist ein einfaches Beispiel für Ihren Fall:

LoggedInComponent.cs:

public class LoggedInComponent: ViewComponent
{
    public async Task<IViewComponentResult> InvokeAsync()
    {
        return View(HttpContext.Request.Cookies.Get("Bearer"));
    }
}

Komponentensicht:

@model string

@Html.Raw(Model)

_Layout.cshtml:

@await Component.InvokeAsync("LoggedInComponent")

Siehe auch https://docs.asp.net/de/latest/mvc/views/view-components.html

Bearbeiten, um direkt auf Cookie zuzugreifen

@using Microsoft.AspNetCore.Http;

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

Siehe So greifen Sie auf eine Sitzung in einer Ansicht in ASP .NET Core MVC 1.0 zu

3
adem caglin

CookieManager wrapper ermöglicht das Lesen/Schreiben/Aktualisieren/Löschen von HTTP-Cookies in asp.net core. Es verfügt über fließende APIs zur einfachen Bedienung.

Probieren Sie mein Nuget-Paket: https://github.com/nemi-chand/CookieManager

Es verfügt über zwei Schnittstellen ICookie und ICookieManager, die Ihnen helfen, mit http-Cookie in asp.net core zu spielen

fügen Sie einfach den CookieManager im Konfigurationsdienst in der Startklasse hinzu

//add CookieManager
services.AddCookieManager();

In der Layoutseite fügen Sie den Cookie Manager ein

@inject CookieManager.ICookie _httpCookie

_httpCookie.Get("Bearer")
2
Nemi Chand

Ich habe seit ungefähr 2 Stunden damit zu kämpfen, da keine dieser Methoden in .NET Core 2.2 für mich geeignet ist, um einen Cookie-Wert in _Layout.cshtml zu lesen, der entweder zu einem leeren Wert oder zu einem Fehler führt. Ich habe eine Cookie-Set, das den Namen der Datenbank speichert, mit der der Benutzer verbunden ist. Ich möchte dies in der Fußzeile der Webanwendung anzeigen (z. B. Training oder Live).

Was funktionierte, war das Hinzufügen von Folgendes zu _Layout.cshtml:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor

Dann fügte ich dies an der Stelle hinzu, an der der Wert des Cookies angezeigt werden sollte:

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

Dies druckt jetzt entweder "Live System" oder "Training System". An Startup.cs waren keine Änderungen erforderlich.

0
Robin Wilson