web-dev-qa-db-fra.com

cookie d'accès dans _Layout.cshtml dans ASP.NET Core

J'essaie de stocker une clé d'authentification dans mes cookies lorsque la connexion a réussi:

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

Donc, dans la classe de contrôleur, cela fonctionne. Je peux facilement créer et lire mes cookies. Mais maintenant, je veux vérifier et, s’il existe, lire la valeur d’un cookie dans mon _Layout.cshtml et afficher le nom de l’utilisateur connecté - ou le lien permettant de se connecter . Mais comment puis-je lire mes cookies dans le _Layout.cshtml partiel?

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

ne fonctionne pas. Il essaie d'ajouter soit System.Web à mes utilisations, soit de dire que HttpContext est statique et nécessite une référence pour accéder à Request.

Des suggestions ou des idées?

13
Matthias Burger

Dans ASP.NET Core, il n’existe plus de concept d’un HttpContext statique. Règles d'injection de dépendance dans le nouveau Microsoft Web Framework. En ce qui concerne les vues, il existe la directive @inject pour accéder aux services enregistrés comme le service IHttpContextAccessor ( https://docs.asp.net/en/latest/mvc/views/dependency-injection.html ).

En utilisant IHttpContextAccessor, vous pouvez obtenir les informations HttpContext et les cookies, comme dans cet exemple.

 @inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor

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

J'ai donc trouvé la solution, si quelqu'un en avait aussi besoin:

Ajouter dans ConfigureServices le service pour IHttpContextAccessor

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

dans votre _Layout.cs injecter IHttpContextAccessor:

@inject IHttpContextAccessor httpContextaccessor

accéder aux cookies avec

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

Vous n'avez pas besoin d'injection de dépendance ou quoi que ce soit d'autre. Vous accédez au cookie sur ASP.NET Core 2.0 MVC in view comme ça:

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

Il existe un autre moyen de traiter votre cas: en utilisant le composant view.

Voici un exemple simple pour votre cas:

LoggedInComponent.cs:

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

Vue des composants:

@model string

@Html.Raw(Model)

_Layout.cshtml:

@await Component.InvokeAsync("LoggedInComponent")

Voir aussi https://docs.asp.net/fr/latest/mvc/views/view-components.html

Edit pour accéder directement au cookie

@using Microsoft.AspNetCore.Http;

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

Voir Comment accéder à une session depuis une vue dans ASP .NET Core MVC 1.0

3
adem caglin

Le gestionnaire CookieManager vous permet de lire/écrire/mettre à jour/supprimer un cookie http dans le noyau asp.net. il a API facile à utiliser.

Essayez mon pack de pépites: https://github.com/nemi-chand/CookieManager

Il a deux interfaces ICookie et ICookieManager qui vous permet de jouer avec le cookie http dans le noyau asp.net

il suffit d'ajouter le CookieManager dans le service de configuration dans la classe de démarrage

//add CookieManager
services.AddCookieManager();

Dans la page de mise en page injecter le gestionnaire de cookies

@inject CookieManager.ICookie _httpCookie

_httpCookie.Get("Bearer")
2
Nemi Chand

Cela fait environ deux heures que j'ai du mal à résoudre ce problème, car aucune de ces méthodes ne fonctionne dans .NET Core 2.2 pour lire une valeur de cookie dans _Layout.cshtml, ce qui entraîne soit une valeur vide, soit une erreur . J'ai un jeu de cookies. qui stocke le nom de la base de données à laquelle l'utilisateur est connecté et que je souhaite afficher dans le pied de page de l'application Web (c.-à-d. Training ou Live).

Ce qui a fonctionné a été d’ajouter ce qui suit au sommet de _Layout.cshtml:

@using Microsoft.AspNetCore.Http
@inject IHttpContextAccessor HttpContextAccessor

Ensuite, j'ai ajouté ceci à l'emplacement où je voulais que la valeur du cookie apparaisse:

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

Ceci affiche maintenant "Live System" ou "Training System" . Aucune modification de Startup.cs n'a été nécessaire.

0
Robin Wilson