Getting authenticate AD users objectGuid from asp.net

前端 未结 3 1606
名媛妹妹
名媛妹妹 2020-12-30 13:36

I am using windows authentication within an ASP.NET application. I am wondering how to best get the objectGuid from the currently logged in user?

Regards, Egil.

相关标签:
3条回答
  • 2020-12-30 13:56

    You need to use NativeGuid property. C# code:

    string login = HttpContext.Current.User.Identity.Name;
    string domain = login.Substring(0, login.IndexOf('\\'));
    string userName = login.Substring(login.IndexOf('\\') + 1);
    DirectoryEntry domainEntry = new DirectoryEntry("LDAP://" + domain);
    DirectorySearcher searcher = new DirectorySearcher(domainEntry);
    searcher.Filter = string.Format(
       "(&(objectCategory=person)(objectClass=user)(sAMAccountName={0}))",
       userName);
    SearchResult searchResult = searcher.FindOne();
    DirectoryEntry entry = searchResult.GetDirectoryEntry();
    Guid objectGuid = new Guid(entry.NativeGuid);
    
    0 讨论(0)
  • 2020-12-30 13:59

    You can do this with the System.DirectoryServices namespace.

    Dim entry As DirectoryServices.DirectoryEntry
    Dim mySearcher As System.DirectoryServices.DirectorySearcher
    Dim result As System.DirectoryServices.SearchResult
    Dim myEntry As DirectoryEntry
    Dim domainName As String
    Dim userId As String
    Dim objectGuid As Guid
    
    'Split the username into domain and userid parts
    domainName = Page.User.Identity.Name.Substring(0, Page.User.Identity.Name.IndexOf("\"))
    userId = Page.User.Identity.Name.Substring(Page.User.Identity.Name.IndexOf("\") + 1)
    
    'Start at the top level domain
    entry = New DirectoryEntry(domainName)
    
    mySearcher = New DirectorySearcher(entry)
    
    'Build a filter for just the user
    mySearcher.Filter = ("(&(anr=" & userId & ")(objectClass=user))")
    
    'Get the search result ...
    result = mySearcher.FindOne
    
    '... and then get the AD entry that goes with it
    myEntry = result.GetDirectoryEntry
    
    'The Guid property is the objectGuid
    objectGuid = myEntry.Guid
    

    There might be a better way to do this, but this works!

    0 讨论(0)
  • 2020-12-30 14:09

    The suggest solutions are rather expensive. Rather than searching by domain and username, a better solution is to use the SID to lookup the account:

    // using System.Security.Principal;
    IPrincipal userPrincipal = HttpContext.Current.User;
    WindowsIdentity windowsId = userPrincipal.Identity as WindowsIdentity;
    if (windowsId != null)
    {
        SecurityIdentifier sid = windowsId.User;
    
        using(DirectoryEntry userDe = new DirectoryEntry("LDAP://<SID=" + sid.Value + ">"))
        {
            Guid objectGuid = new Guid(userDe.NativeGuid);
        }
    }
    
    0 讨论(0)
提交回复
热议问题