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?
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
}
}
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"])
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);
}
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
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")
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.