webentwicklung-frage-antwort-db.com.de

Greifen Sie auf die Benutzeridentität über den Controller in der ASP.NET Core-Web-API zu

Gemäß dieser Dokumentation:

ASP.NET Core 2.1-Dokumentation

Ich sollte in der Lage sein, mit ControllerBase.User oder HttpContext.Use r auf die Benutzeridentität zuzugreifen.

Wie im obigen Link:

„Das Abrufen der aktuellen Benutzeridentität aus der DI-Servicesammlung der App ist auch testbarer, da Testidentitäten einfach eingefügt werden können.“

Nach meinem Verständnis sollte ich die Identitätsinformationen mit Hilfe der Abhängigkeitsinjektion in Startup.cs oder möglicherweise im Konstruktor des Controllers einfügen.

Nach endlosen Stunden der Untersuchung kann ich das Verfahren jedoch nicht finden.

Die folgenden Schritte beschreiben mein Szenario. Ich hoffe, jemand kann mich in die richtige Richtung leiten.

1) Erstellen Sie mit Visual Studio 2017 ein ASPNET.core-Web-API-Projekt mit den folgenden Optionen:

  • Geben Sie Folgendes ein: API
  • Docker-Support aktivieren: Nein
  • Authentifizierung: Keine Authentifizierung
  • Konfigurieren Sie für HTTPS: Ja

2) Fügen Sie AuthDetailsController.cs mit dem folgenden Code zu den Controllers-Ordnern hinzu:

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) Stellen Sie Azure als neue Anwendung bereit

4) Navigieren Sie zu https: // [site_name] .azurewebsites.net/api/AuthDetails

5) Es gibt keine Informationen zur Benutzeridentität, da der Zugriff anonym ist:

{"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) Aktivieren Sie die Azure-Authentifizierung mit den folgenden Optionen:

  • Durchzuführende Aktion, wenn die Anforderung nicht authentifiziert ist: Anmelden bei Azure Active Directory.
  • Azure Active Directory-Konfiguration: Express-Modus

7) Wieder öffnen https: // [site_name] .azurewebsites.net/api/AuthDetails

8) Sie werden zur Anmeldeseite weitergeleitet

9) Nach der erfolgreichen Anmeldung gibt es weder in ControllerBase.User noch in HttpContext.User eine Identitätsinformation. Die Antwort ist dieselbe wie vor der Aktivierung der Authentifizierung. 

4
Pablo

Ich habe es gemacht !!!

Diese Dokumentation wies mich in die richtige Richtung.

Dies sind die Schritte, um mein Szenario zu reproduzieren:

1) Erstellen Sie mit Visual Studio 2017 ein ASPNET.core-Web-API-Projekt mit den folgenden Optionen:

  • Geben Sie Folgendes ein: API
  • Docker-Support aktivieren: Nein
  • Authentifizierung: Keine Authentifizierung
  • Konfigurieren Sie für HTTPS: Ja

2) Fügen Sie AuthDetailsController.cs mit dem folgenden Code zum Ordner "Controller" hinzu:

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) Stellen Sie Azure als neue Anwendung bereit

4) Aktivieren Sie die Azure-Authentifizierung mit den folgenden Optionen:

  • Durchzuführende Aktion, wenn die Anforderung nicht authentifiziert ist: Anmelden bei Azure Active Directory.
  • Azure Active Directory-Konfiguration: Express-Modus

5) Öffnen Sie https: // [site_name] .azurewebsites.net/api/AuthDetails

6) Sie werden zur Anmeldeseite weitergeleitet

7) Nach dem erfolgreichen Login erhalten Sie die Antwort:

{"X-MS-CLIENT-PRINCIPAL-NAME":"[email protected]_domain","X-MS-CLIENT-PRINCIPAL-ID":"your_user_ad_guid"}
0
Pablo

Dieses Beispiel funktioniert:

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

Ich kann den Benutzer innerhalb eines Controllers identifizieren mit:

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

Es ist ein anderer Projekttyp. Es ist eine MVC-Website anstelle eines API-Projekts.

Es ist nicht genau das, wonach ich gesucht habe, aber es funktioniert zumindest ... Ich werde untersuchen, wie ich dies auf mein API-Projekt anwenden kann.

0
Pablo

Sie müssen die Authentifizierung angeben, die in Ihrer startup.cs verwendet werden muss.

Es wäre so etwas.

services.AddAuthentication(IISDefaults.AuthenticationScheme);

Den Link zu diesen Angaben finden Sie auf this .

Auch bei Aktionen in Ihrem Controller müssen Sie [Authorize] hinzufügen. Nur wenn dies hinzugefügt wird, können Sie die Details abrufen. Wenn Sie auf Controller-Ebene hinzufügen, können Sie für die Aktionen, bei denen Sie keine Authentifizierung benötigen, [AllowAnonymous] hinzufügen.

[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