none
ASP.NET Core Zugriff auf S-ID (Security Identifier) eines Benutzers RRS feed

  • Frage

  • Hi zusammen,

    ich sitze vor einem kleinen Problem. Wir arbeiten an einer Web-App, welche auf der einen Seite ein Frontend (Blazor) hat und auf der anderen Seite eine REST-API. Beides wird über einen Microsoft Account (Firmenintern) geschützt. Man muss sich also mit einem Microsoft-Account unseres Active-Directory anmelden. Im Frontend macht ASP.NET Core alles automatisch und ich kann über die folgenden Zeile den aktuell angemeldeten Benutzers auslesen:

    [CascadingParameter] Task<AuthenticationState> authenticationStateTask { get; set; }
    
    protected override async Task OnInitializedAsync()
    {
        AuthenticationState authState = await authenticationStateTask;
        this._user = authState.User;
    }

    Über die API ist das scheinbar nicht so einfach. Ich melde mich zuerst in der Xamarin-App wieder mit dem Microsoft-Account an. Nach erfolgreichem Login erhalte ich ein Objekt in dem verschiedene Informationen gespeichert sind. Unter anderem die des Benutzers und ein Bearer-Token. Letzeren übergebe ich der API, damit diese die Requests zulässt. Soweit so gut. In dem Objekt sind zwar diverse Benutzer-Informationen gespeichert, allerdings fehlt die S-ID des Benutzers. Die Id (Guid) des Benutzers ist zwar dabei, wie auch im Frontend, allerdings stimmt diese nicht mit unserem lokalen AD-Server überein. Einzige ID, welche zwischen lokalem AD und Azure, Microsoft Auth, etc. übereinstimmt ist die S-ID.

    Die S-ID (Security Identifier) ist im Format "S-1-5-21-7623811015-3361044348-030300820-1013".

    Über Microsoft Graph habe ich schon versucht weitere Informationen des Benutzers auszulesen, in der Hoffnung an diese S-ID zu kommen, aber überall gibt es nur die normale Guid.

    Ich habe schon einen Großteil des ASP.NET Core Quellcodes durchsucht, denn Blazor bzw. ASP.NET Core muss diese S-ID ja irgendwoher bekommen. Meine Idee war es diese Stelle zu finden und das zu übernehmen - Ohne Erfolg.

    Hat jemand eine Idee wie ich an die S-ID komme?

    Viele Grüße


    Viele Grüße
    Lars Krämer - Software Entwickler für Web und Microsoft-Technologien


    lkraemer.de software solutions

    Dienstag, 7. Januar 2020 18:25

Alle Antworten

  • Hallo Lars,

    ich bezweifle das man über die standard Apis an diese Id kommt. oAuth kennt diese Id nicht und brauch sie auch nicht. Die AD wird behandelt wie jeder andere externe Anbieter (Facebook, Google, usw).

    Wenn die Id irgendwo steht dann im Claim

    Hier wird dies auch beschrieben Link das diese dort zu finden ist. Wie genau steht da aber nicht.

    Ich habe hier auch kein Testsystem mit dem ich mir das selbst anschauen könnte


    Gruß Thomas
    13 Millionen Schweine landen jährlich im Müll
    Dev Apps von mir: UWP Segoe MDL2 Assets, UI Strings


    Mittwoch, 8. Januar 2020 15:44
  • Hi

    zunächst danke für deine Antwort.

    In der Tat gibt es eine Möglichkeit an die S-ID zu kommen. Ich habe mir dafür folgende Methode geschrieben:

    public SecurityIdentifier getPrincipalUserByPrincipalName(string userPrincipalName)
    {
        SecurityIdentifier securityIdentifier = null;
    
        using (PrincipalContext principalContext = new PrincipalContext(ContextType.Domain))
        {
            UserPrincipal user = UserPrincipal.FindByIdentity(principalContext, IdentityType.UserPrincipalName, userPrincipalName);
    
            securityIdentifier = user.Sid;
        }
    
        return securityIdentifier;
    }

    Hier wird für den PrincipalName des Benutzers die S-ID korrekt geladen. Wie ich später herausfinden musste, muss die App dafür den lokalen LDAP-Server erreichen können, was nach dem Deployment nach Azure nicht mehr der Fall ist.

    Fakt ist allerdings, dass es irgendwo in den Tiefen von .NET Core eine Methode gibt die das ganze auch in Azure laden kann. Denn im Frontend rufe ich bei einer Aktion für den aktuell angemeldeten Benutzer (Nicht über die API, sondern über das Blazor-Frontend) seine S-Id ab und die ist 1. auch in Azure verfügbar und 2. für jeden Benutzer korrekt.

    Es muss also eine Methode geben.

    Viele Grüße


    Viele Grüße
    Lars Krämer - Software Entwickler für Web und Microsoft-Technologien


    lkraemer.de software solutions

    Mittwoch, 8. Januar 2020 20:11