2017-05-08 20 views
0

사람들이 SSRS 보고서를 내부 또는 외부에서 볼 수있는 웹 응용 프로그램입니다.AD - ASP.NET MVC에 대한 사용자 인증 시도

사용자 지정 권한 부여 역할을 사용하여 활성 디렉토리 그룹에 로그인하는 사용자를 인증하려고하므로 특정 AD 그룹에 있는지 여부에 따라 보고서를 보호 할 수 있습니다.

이제 Windows 정품 인증/양식 인증을받은 상자에서 작동하지만 다른 이유로 인해 사용자 지정 인증을 사용하고 있지만 사용자가 로깅하는 사용자 지정 사용자 이름을 가진 테이블이 있음을 알고 있습니다. 그들의 Windows 자격 증명에 대해 매핑됩니다.

나는 blog을 따라 Active Directory 그룹에 대해이 인증 방법을 테스트하고 사용자 지정 사용자 로그인에 매핑 된 Windows 자격 증명을 전달하지만 지금까지 행운이 없다는 것을 사용자 정의했습니다.

사용자 인증과 관련하여 일치하는 도메인 이름을 내 테이블에서 찾아서 세션 변수에 저장하면이 AD 인증 프로세스로 전달되어 세션 변수에 사용자가 있는지 확인합니다. 그룹이든 아니든간에 아래 코드를 참조하십시오.

사용자 정의 속성 부여,

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 도우미, Web.config의에서

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 연결 문자열 (확인할 수 있습니다 정확),

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

내 문제 I LDAP 연결 문자열에서 컨테이너 (GetLDAPHelper 메서드)를 Princip으로 반환하려고 할 때가 생각됩니다. alContext는 null을 리턴하고 오류를 던지는 것뿐입니다.

누구든지 원격으로 비슷한 작업을 수행했는지 또는 내가하고있는 작업을 수행하기 위해 더 적합한 방법이 있는지 찾고 있습니다.

+0

무엇이 오류입니까? – raven

+0

GetLDAPContainer 메서드가 ParseLDAPConnectionString 메서드로 이동하여 ldapUri을 반환하면 Null 참조 예외가 발생합니다. 디버깅 할 때 connString 변수 위에 커서를 놓으면 연결 문자열이 올바르게 표시되고 GetLDAPContainer 메서드로 반환되지 않습니다. –

+0

ldapUri.PathAndQuery가 null 인 이유입니다. – raven

답변

0

문제는 LDAP 연결 문자열이 유효하지 않으므로 Uri이므로 시도 할 때 ldapUri은 null로 유지됩니다. 어떤 이유로 연결 문자열을 구문 분석해야하는 경우 다른 방법으로이를 수행해야합니다. Uri을 사용할 수 없습니다.

관련 문제