试图根据AD对用户进行身份验证 - ASP.NET MVC
问题描述:
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并抛出一个错误。
我正在查看是否有人做了任何远程类似的事情,或者有没有更适合的方法来尝试实现我在做什么?
答
问题是LDAP连接字符串不是有效的Uri
,因此当您尝试将其设置为1时,ldapUri
保持为空。如果您需要解析连接字符串,出于某种原因,您需要以另一种方式进行操作。您不能使用Uri
。
什么是错误? – raven
当我的GetLDAPContainer方法转到ParseLDAPConnectionString方法以返回ldapUri时,为空引用异常。 当我调试并将光标放在connString变量上时,它会正确显示连接字符串,但不会将其返回给GetLDAPContainer方法。 –
ldapUri.PathAndQuery为空,这就是为什么。 – raven