2017-05-08 7 views
0

Eine Webanwendung, in der Benutzer ihre SSRS - Berichte intern oder extern anzeigen können.Der Versuch, Benutzer mit dem AD - ASP.NET MVC zu authentifizieren

Ich versuche Benutzer, die sich mit den Active Directory-Gruppen anmelden, mit benutzerdefinierten Autorisierungsrollen zu authentifizieren, damit die Berichte basierend darauf gesichert werden können, ob sie sich in einer bestimmten AD-Gruppe befinden oder nicht.

Jetzt weiß ich, das funktioniert die Box mit Windows Auth/Form Auth, aber ich benutze eine benutzerdefinierte Authentifizierung aus anderen Gründen, aber was ich habe, ist eine Tabelle, die die benutzerdefinierten Benutzernamen hat, mit denen sich die Benutzer anmelden auf ihre Windows-Anmeldeinformationen abgebildet.

Ich habe diese blog verfolgt, um diese Methode der Authentifizierung gegen die Active Directory-Gruppen zu testen und angepasst, um die Windows-Anmeldeinformationen an die benutzerdefinierte Benutzeranmeldung übergeben, aber bisher kein Glück. Im Hinblick auf die benutzerdefinierte Authentifizierung suche ich den passenden Domainnamen aus meiner Tabelle heraus und speichere diesen Domainnamen in der Sitzungsvariablen, die dann in diesen AD - Authentifizierungsvorgang zur Prüfung, ob der Benutzer in der Gruppe oder nicht, siehe Code unten.

Gewohnheit autorisieren Attribut,

using Helpers; 
using Models; 
using System; 
using System.Web; 
using System.Web.Mvc; 

namespace Application.Validators 
{ 
public class AuthorizeADAttribute : AuthorizeAttribute 
{ 
    public string Group { get; set; } 

    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
      if (string.IsNullOrEmpty(Group)) 
      { 
       return true; 
      } 

      var logOnInfo = httpContext.Session["LogOnInfo"] as LogOnModel; 
      var username = logOnInfo.DomainName; 

      try 
      { 
       return LDAPHelper.UserIsMemberOfGroups(username, Group); 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
    } 
} 
} 

LDAP-Helfer,

using System; 
using System.Configuration; 
using System.DirectoryServices.AccountManagement; 
using System.Web; 

namespace Application.Helpers 
{ 
public class LDAPHelper 
{ 
    public static string GetLDAPContainer() 
    { 
     Uri ldapUri; 
     ParseLDAPConnectionString(out ldapUri); 
     return HttpUtility.UrlDecode(ldapUri.PathAndQuery.TrimStart('/')); 
    } 

    public static bool ParseLDAPConnectionString(out Uri ldapUri) 
    { 
     string connString = 
    ConfigurationManager.ConnectionStrings["ADConnectionString"] 
    .ConnectionString; 
     return Uri.TryCreate(connString, UriKind.Relative, out ldapUri); 
    } 
    public static bool UserIsMemberOfGroups(string username, string Group) 
    { 
     if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(Group)) 
     { 
      return false; 
     } 

     // Verify that the user is in the given AD group (if any) 
     using (var context = BuildPrincipalContext()) 
     { 
      var userPrincipal = UserPrincipal.FindByIdentity(context, 
      IdentityType.SamAccountName, 
      username); 

      return userPrincipal.IsMemberOf(context, IdentityType.Name, Group); 
     } 
    } 

    public static PrincipalContext BuildPrincipalContext() 
    { 
     string container = GetLDAPContainer(); 
     return new PrincipalContext(ContextType.Domain, null, container); 
    } 
} 
} 

LDAP-Verbindungszeichenfolge in der web.config (bestätigen kann, ist richtig),

<add name="ADConnectionString" connectionString="LDAP://CN=Managers;OU=Groups,OU=Users,DC=domain"/> 

Mein Problem I denke ich, wenn ich versuche, den Container (GetLDAPHelper-Methode) von der LDAP-Conn-Zeichenfolge zurück zum Princip zurückzugeben alContext gibt nur null zurück und wirft einen Fehler auf.

Ich suche, ob jemand etwas entfernt ähnlich getan hat oder gibt es eine geeignetere Methode zu versuchen, zu erreichen, was ich tue?

+0

Was ist der Fehler? – raven

+0

Nullreferenzausnahme, wenn meine GetLDAPContainer-Methode die ParseLDAPConnectionString-Methode aufruft, um die ldapUri zurückzugeben. Wenn ich debuggen und den Cursor über die ConnString-Variable setzen, zeigt es mir die Verbindungszeichenfolge korrekt an, nur wird es nicht an die GetLDAPContainer-Methode zurückgegeben. –

+0

ldapUri.PathAndQuery ist null, deshalb. – raven

Antwort

0

Das Problem ist, dass die LDAP-Verbindungszeichenfolge keine gültige Uri ist. Wenn Sie versuchen, eine solche Adresse zu erstellen, bleibt ldapUri null. Wenn Sie die Verbindungszeichenfolge aus irgendeinem Grund analysieren müssen, müssen Sie dies auf andere Weise tun. Sie können Uri nicht verwenden.

Verwandte Themen