web-dev-qa-db-fra.com

Accès à l'identité de l'utilisateur à partir du contrôleur dans l'API Web ASP.NET Core

Selon cette documentation:

Documentation ASP.NET Core 2.1

Je devrais pouvoir accéder à l'identité de l'utilisateur avec ControllerBase.User ou HttpContext.Use r.

Selon le lien ci-dessus:

"Obtenir l'identité de l'utilisateur actuel à partir de la collection de services DI de l'application est également plus testable, car les identités de test peuvent être facilement injectées."

Si j'ai bien compris, je devrais injecter les informations d'identité à l'aide de l'injection de dépendance dans Startup.cs ou peut-être dans le constructeur du contrôleur.

Cependant, après des heures d’investigation sans fin, je ne parviens pas à trouver la procédure.

Les étapes suivantes décrivent mon scénario. J'espère que quelqu'un pourra me guider dans la bonne direction.

1) À l'aide de Visual Studio 2017, créez un projet d'API Web ASPNET.core avec les options suivantes:

  • Type: API
  • Activer le support Docker: non
  • Authentification: aucune authentification
  • Configurer pour HTTPS: oui

2) Ajoutez AuthDetailsController.cs aux dossiers des contrôleurs avec le code suivant:

using System;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApi.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : Controller
    {


        [HttpGet]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }

    }
}

3) Déployer sur Azure en tant que nouvelle application

4) Accédez à https: // [nom_site] .azurewebsites.net/api/AuthDetails

5) Il n'y a pas d'informations sur l'identité de l'utilisateur car l'accès est anonyme:

{"User.Identities":[{"authenticationType":null,"isAuthenticated":false,"actor":null,"bootstrapContext":null,"claims":[],"label":null,"name":null,"nameClaimType":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name","roleClaimType":"http://schemas.Microsoft.com/ws/2008/06/identity/claims/role"}],"User.Claims":[],"HttpContext.User.Identities":[{"authenticationType":null,"isAuthenticated":false,"actor":null,"bootstrapContext":null,"claims":[],"label":null,"name":null,"nameClaimType":"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name","roleClaimType":"http://schemas.Microsoft.com/ws/2008/06/identity/claims/role"}],"HttpContext.User.Claims":[]}

6) Activez l'authentification Azure avec les options suivantes:

  • Action à entreprendre lorsque la demande n'est pas authentifiée: Ouvrez une session avec Azure Active Directory.
  • Configuration Azure Active Directory: Mode Express

7) Ouvrez à nouveau https: // [nom_site] .azurewebsites.net/api/AuthDetails

8) Vous êtes redirigé vers la page de connexion

9) Après la connexion réussie, il n'y a aucune information d'identité dans ControllerBase.User ni HttpContext.User. La réponse est la même qu'avant l'activation de l'authentification.

4
Pablo

Je l'ai fait !!!

Cette documentation m'a dirigé dans la bonne direction.

Voici les étapes à suivre pour reproduire mon scénario:

1) À l'aide de Visual Studio 2017, créez un projet d'API Web ASPNET.core avec les options suivantes:

  • Type: API
  • Activer le support Docker: non
  • Authentification: aucune authentification
  • Configurer pour HTTPS: oui

2) Ajoutez AuthDetailsController.cs au dossier Controllers avec le code suivant:

using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc;

namespace CoreWebApiTest2.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class AuthDetailsController : ControllerBase
    {
        // GET: api/AuthDetails
        [HttpGet]
        public Dictionary<string,string> Get()
        {
            return new Dictionary<string, string> { {"X-MS-CLIENT-PRINCIPAL-NAME", Request.Headers["X-MS-CLIENT-PRINCIPAL-NAME"] },
                                                    {"X-MS-CLIENT-PRINCIPAL-ID", Request.Headers["X-MS-CLIENT-PRINCIPAL-ID"]  } };

        }
    }
}

3) Déployer sur Azure en tant que nouvelle application

4) Activez l'authentification Azure avec les options suivantes:

  • Action à prendre lorsque la demande n'est pas authentifiée: Ouvrez une session avec Azure Active Directory.
  • Configuration Azure Active Directory: Mode Express

5) Ouvrez https: // [nom_site] .azurewebsites.net/api/AuthDetails

6) Vous êtes redirigé vers la page de connexion

7) Après la connexion réussie, vous obtenez la réponse:

{"X-MS-CLIENT-PRINCIPAL-NAME":"your_user@your_domain","X-MS-CLIENT-PRINCIPAL-ID":"your_user_ad_guid"}
0
Pablo

Cet exemple fonctionne:

https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2

Je peux identifier l'utilisateur dans un contrôleur à l'aide de:

User.FindAll("preferred_username").First().Value;

C'est un type de projet différent. c'est un site Web MVC au lieu d'un projet d'API.

Ce n'est pas exactement ce que je cherchais, mais au moins, cela fonctionne ... Je vais étudier comment l'appliquer à mon projet d'API.

0
Pablo

Vous devez indiquer l'authentification à utiliser dans votre fichier startup.cs.

Ce serait quelque chose comme.

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Le lien vers ces détails peut être trouvé sur this .

Également pour les actions de votre contrôleur, vous devez ajouter [Autoriser]. Ce n'est que lorsque cela sera ajouté que vous pourrez récupérer les détails. Si vous ajoutez au niveau du contrôleur, vous pouvez ajouter [AllowAnonymous] pour les actions pour lesquelles vous n'avez pas besoin d'authentification.

[HttpGet]
[Authorize]
        public JsonResult Get()
        {
            var r = new Dictionary<String, Object>();

            r.Add("User.Identities", User.Identities);
            r.Add("User.Claims", User.Claims);
            r.Add("HttpContext.User.Identities", HttpContext.User.Identities);
            r.Add("HttpContext.User.Claims", HttpContext.User.Claims);

            return Json(r );
        }
0
coolcake