Ответ 1
Итак, я закончил реализацию своего собственного атрибута 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(...)
. Подробнее см. здесь.
Если вы хотите узнать, как перенаправить на другую страницу на основе неудачной авторизации, проверьте мой ответ здесь: Добавление сообщения об ошибке в модель представления на основе атрибута контроллера в ASP.NET MVC