MVC授权属性工作而不注销

时间:2017-07-21 19:07:07

标签: c# asp.net-mvc asp.net-mvc-5

我有一个控制器类,只有特定的Active Directory组才能访问。

[Authorize(Roles = @"Domain\GroupName")]
public class AdminToolsController : Controller
{
    ...
}

现在我正在测试..我目前不在小组..但如果我添加自己..并且我尝试访问此控制器中的任何内容我仍然被要求登录并且我的凭据不起作用。但是..如果我添加自己..然后注销..然后重新登录..然后尝试访问此控制器中的任何内容它识别我并允许我访问。

无论如何都要立即这样做吗?意思是,我可以将自己添加到组中并成功访问控制器内的任何方法,而无需注销并重新登录吗?

更新

我已经编辑了Camilo Terevinto的回答如下。他们的答案出于某种原因......每当我从特定组中添加或删除我的自我时......该组不会成为变量groups的一部分。

这是我的更新:

public class AuthorizeByActiveDirectoryGroups : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var roles = Roles.Split(',');
        using (var domainContext = new PrincipalContext(ContextType.Domain, "domainname"))
        {
            var user = httpContext.User.Identity.Name;
            using (var domainUser = UserPrincipal.FindByIdentity(domainContext, httpContext.User.Identity.Name))
            {
                var adgroup = GroupPrincipal.FindByIdentity(domainContext, "Domain\\GroupName");
                bool member = domainUser.IsMemberOf(adgroup);
                var groups = domainUser.GetAuthorizationGroups();
                return member;
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

IIRC,只有在您使用默认的Windows身份验证登录时才会获得一次角色,因此为了始终获得最新信息,您可以使用自定义属性。
由于这将始终检查AD值,您可以使用一些缓存并仅在需要时刷新值,但这取决于您的具体情况。

注意:我现在没有VS,所以可能会出现拼写问题

public class AuthorizeByActiveDirectoryGroupsAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var roles = Roles.Split(",");
        using (var domainContext = new PrincipalContext(ContextType.Domain))
        {
            using (var domainUser = UserPrincipal.FindByIdentity(domainContext, httpContext.User.Identity.Name))
            {
                var groups = domainUser.GetAuthorizationGroups();
                return groups
                    .Select(x => x.Name) // the group name
                    .Any(x => roles.Contains(x)); // any group is one of the specified in the Roles property of the attribute
            }
        }
    }
}

所以你会像以下一样使用它:

[AuthorizeByActiveDirectoryGroups(Roles = "Group1,Group2")]
public ActionResult Index()
{
    return View();
}

答案 1 :(得分:2)

在Windows中,如果已从组中分配或删除用户,则此更改将在下次登录时生效。这是 Windows行为。因此,在您注销并登录后,它会按预期工作,如您所见。

双击Windows计算机中的组时,底部会显示此信息,表示更改在登录后生效。

enter image description here

答案 2 :(得分:0)

如果您使用的是Cookie,则需要确保在分配新角色后使用新角色重新创建Cookie

onActivityResult

在您添加角色" Domain \ GroupName"之后立即添加此代码给你的用户