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