2017-05-08 57 views
0

Web应用程序,用户可以在其中内部或外部查看其SSRS报告。试图根据AD对用户进行身份验证 - ASP.NET MVC

我正在尝试使用自定义授权角色对活动目录组进行登录身份验证,因此可以根据它们是否位于特定AD组中来确保报告的安全性。

现在我知道这与Windows身份验证/表单身份验证,但由于其他原因使用自定义身份验证,但我所拥有的是具有用户登录自定义用户名的表映射到他们的Windows凭据。

我一直在关注这个blog来测试这种针对活动目录组进行身份验证的方法,并对它进行了自定义以传递映射到自定义用户登录的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"/> 

我的问题,我想当我试图从LDAP连接字符串返回容器(GetLDAPHelper方法)回到Princip alContext它只是返回null并抛出一个错误。

我正在查看是否有人做了任何远程类似的事情,或者有没有更适合的方法来尝试实现我在做什么?

+0

什么是错误? – raven

+0

当我的GetLDAPContainer方法转到ParseLDAPConnectionString方法以返回ldapUri时,为空引用异常。 当我调试并将光标放在connString变量上时,它会正确显示连接字符串,但不会将其返回给GetLDAPContainer方法。 –

+0

ldapUri.PathAndQuery为空,这就是为什么。 – raven

回答

0

问题是LDAP连接字符串不是有效的Uri,因此当您尝试将其设置为1时,ldapUri保持为空。如果您需要解析连接字符串,出于某种原因,您需要以另一种方式进行操作。您不能使用Uri

相关问题