我正在尝试使用ASP.NET MVC中的用户和组对Active Directory进行身份验证。
我在我的所有课程上都设置了以下属性(帐号类除外):
[Authorize (Roles="SubcontractDB Users")]
此组位于OU = Area-> OU = Groups-> OU = Company-> CN =活动目录中的SubcontractDB下。我假设我还需要在web.config中设置一个RoleManager,我试图按如下方式进行:
<roleManager defaultProvider="ADRoleProvider">
<providers>
<clear />
<add name="ADMembershipProvider"
type="System.Web.Security.ActiveDirectoryMembershipProvider"
connectionStringName="ADConnectionString"
attributeMapUsername="sAMAccountName" />
</providers>
</roleManager>
我的连接字符串是:
<add name="ADConnectionString"
connectionString="LDAP://blah.com:389/DC=blah,DC=wateva,DC=com"/>
显然我做错了,因为这不起作用。我想要做的就是允许访问属于AD中某个组成员的用户。
答案 0 :(得分:33)
所以我最终实现了自己的authorize属性并使用了它:
namespace Application.Filters
{
public class AuthorizeADAttribute : AuthorizeAttribute
{
public string Groups { get; set; }
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (base.AuthorizeCore(httpContext))
{
/* Return true immediately if the authorization is not
locked down to any particular AD group */
if (String.IsNullOrEmpty(Groups))
return true;
// Get the AD groups
var groups = Groups.Split(',').ToList<string>();
// Verify that the user is in the given AD group (if any)
var context = new PrincipalContext(ContextType.Domain, "server");
var userPrincipal = UserPrincipal.FindByIdentity(context,
IdentityType.SamAccountName,
httpContext.User.Identity.Name);
foreach (var group in groups)
if (userPrincipal.IsMemberOf(context, IdentityType.Name, group))
return true;
}
return false;
}
}
}
然后我可以简单地使用以上控制器或函数
Using Application.Filters;
...
[AuthorizeAD(Groups = "groupname")]
NB:您可以简单地使用new PrincipalContext(ContextType.Domain);
但是.NET 4.0中存在一个错误,会在(0x80005000)
处引发userPrincpal.IsMemberOf(...)
错误。有关详细信息,请参阅here。
如果您想知道如何根据授权失败重定向到其他网页,请在此处查看我的答案:Adding an error message to the view model based on controller attribute in ASP.NET MVC
答案 1 :(得分:32)
不再需要在ASP.NET MVC 3中为此功能实现自己的属性。AspNetWindowsTokenRoleProvider
适用于Active Directory用户和组。要在AuthorizeAttribute
中使用此功能,您需要将以下内容添加到web.config:
<authentication mode="Windows" />
<roleManager enabled="true" defaultProvider="AspNetWindowsTokenRoleProvider">
<providers>
<clear />
<add
name="AspNetWindowsTokenRoleProvider"
type="System.Web.Security.WindowsTokenRoleProvider"
applicationName="/" />
</providers>
</roleManager>
然后,在您的控制器或操作方法上,您可以像这样引用Active Directory组:
[Authorize(Roles = "YOURDOMAIN\\Group1, YOURDOMAIN\\Group2")]