web-dev-qa-db-fra.com

Comment obtenir un jeton d'accès à partir de HttpContext dans .Net Core 2.0

J'essaie de mettre à niveau un projet de .Net Core 1.1 à .Net Core 2.0. Il y a beaucoup de changements radicaux. Un des problèmes qui me posent actuellement un problème est que HttpContext.Authentication est maintenant obsolète.

J'ai essayé de comprendre comment obtenir le jeton d'accès pour la requête actuelle. J'ai besoin d'appeler une autre API qui nécessite un jeton porteur.

Ancienne méthode .Net 1.1

[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
    var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token");

    return View();
}

Méthode .Net 2.

Cela ne fonctionne pas car le contexte n'est pas enregistré.

[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
    var accessToken = await context.HttpContext.GetTokenAsync("access_token"); 

    return View();
}

Impossible de résoudre le service pour le type 'Microsoft.AspNetCore.Http.HttpContext'

J'ai essayé de l'enregistrer mais ça ne marche pas non plus

public ConsoleController(IOptions<ServiceSettings> serviceSettings, HttpContext context) 

Dans startup.cs

services.TryAddSingleton<HttpContext, HttpContext>();

Mise à jour:

Cela retourne null

var accessToken = await HttpContext.GetTokenAsync("access_token");  

Startup.cs ConfigureServices

Je ne serais pas surpris que ce soit quelque chose dans la startup car il y a eu beaucoup de changements radicaux ici aussi.

services.Configure<ServiceSettings>(Configuration.GetSection("ServiceSettings"));
//services.TryAddSingleton<HttpContext, HttpContext>();
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddMvc();
services.AddAuthentication(options =>
            {

                options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddCookie()
            .AddOpenIdConnect(options =>
            {
                options.Authority = "http://localhost:5000";
                options.ClientId = "testclient";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";
                options.RequireHttpsMetadata = false;
                options.GetClaimsFromUserInfoEndpoint = true;
            });

Configuration de Startup.cs

loggerFactory.AddDebug();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

        app.UseStaticFiles();
        app.UseAuthentication();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
21
DaImTo

Cela a fini par être un problème de configuration. Il doit exister un lien entre AddAuthentication et AddOpenIdConnect pour pouvoir lire le cookie dans les en-têtes.

services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();

services.AddAuthentication(options =>
            {
                options.DefaultScheme = "Cookies";
                options.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("Cookies")
            .AddOpenIdConnect("oidc", options =>
            {
                options.SignInScheme = "Cookies";

                options.Authority = "http://localhost:5000";
                options.RequireHttpsMetadata = false;

                options.ClientId = "testclient";
                options.ClientSecret = "secret";
                options.ResponseType = "code id_token";
                options.SaveTokens = true;
                options.GetClaimsFromUserInfoEndpoint = true;

                options.Scope.Add("testapi");
                options.Scope.Add("offline_access");
            });

Contrôleur

    [Authorize]
    public async Task<IActionResult> Index()
    {
        var accessToken = await HttpContext.GetTokenAsync("access_token");
        return View();
    }

Le jeton d'accès est maintenant rempli.

Note: J'ai fini par le sortir de ce projet Startup.cs

16
DaImTo

. Net core 2.1 pour accéder au jeton porteur JWT

var accessToken = Request.Headers["Authorization"];
31
Chpn Dave

Un peu de changement de réponse Azharuddin

Enregistrez l'instance de service dans la méthode de démarrage comme

public void ConfigureServices(IServiceCollection services)
{

 services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
 ...
}

Et injectez la dépendance dans votre contrôleur comme

private IHttpContextAccessor _httpContextAccessor;
public ClientController(IHttpContextAccessor httpContextAccessor)
{
     _httpContextAccessor = httpContextAccessor;
}

Et récupérez le jeton d'accès dans votre action comme

[Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
    var accessToken = _httpContextAccessor.HttpContext.Request.Headers["Authorization"];

    ..........//Some other code
    return View();
}
7
user1672994

Startup.cs

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

Controller.cs constructeur

private IHttpContextAccessor _httpContextAccessor;
public ClientController(IHttpContextAccessor httpContextAccessor)
{
     _httpContextAccessor = httpContextAccessor;
}



    [Authorize]
public async Task<IActionResult> ClientUpdate(ClientModel client)
{
    var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token"); 

    return View();
}

Cela devrait marcher

2
azharuddin irfani

Vraiment merci, c'est parfait!

J'avais ce travail, mais avec notre autorité dédiée Azure locataire. Remplacez simplement ****** par votre nom de locataire.

options.Authority = "https://login.microsoftonline.com/******.onmicrosoft.com";

Vous pouvez également utiliser l'identifiant du locataire. Insérez simplement votre identifiant de locataire après https://login.microsoftonline.com/

options.Authority = "https://login.microsoftonline.com/be0be093-****-****-****-5626e83beefc";
0
Albo