这是我推荐的。开始寻找ActiveDirectoryMembershipProvider 类的示例。这个 MembershipProvider 与Forms Authentication相结合将为您提供一个安全的系统来验证用户。
一旦通过身份验证,您需要通过将Active Directory 角色提供程序 (ADRP)(用于确定用户组)与保护 MVC 应用程序的标准方法相结合来授权您的用户访问资源。
为了让您开始,我创建了这些简单的扩展方法,您可以扩展以使用 ADRP(因为我没有使用 ADRP)。
public static class IPrincipalExtensions
{
private static _adminName = "Administrator";
public static bool IsAnonymous(this IPrincipal instance)
{
return (instance == null);
}
public static bool IsAdminOrInRole(this IPrincipal instance, string role)
{
if (instance == null
|| instance.Identity == null
|| !instance.Identity.IsAuthenticated)
{
return false;
}
bool result = instance.IsInRole(role)
|| instance.IsInRole(IPrincipalExtensions._adminName));
return result;
}
}
然后我还扩展了默认的AuthorizeAttibute给我一个只能用于管理员的属性:
public class AuthorizeAdministratorAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if (httpContext == null)
{
throw new ArgumentNullException("httpContext");
}
bool result = false;
IPrincipal user = httpContext.User;
if (user.Identity.IsAuthenticated)
{
result = user.IsAdmin();
}
return result;
}
}
这使用了我提供的相同的扩展方法,IPrincipalExtensions
所以我不再重复自己。有些人可能会觉得这有点矫枉过正,因为以下两行是相等的:
[Authorize("Administrator")]
[AuthorizeAdministrator]
但是,由于第一个示例使用的是字符串,因此一个简单的错误类型会拒绝访问,如果我决定将角色/组名称更改为“Admins”,则变得更加困难。因此,如果组更改,使用第二个(我可以说是强类型),我只需要在一个位置更改名称。