【问题标题】:Set user roles on MVC在 MVC 上设置用户角色
【发布时间】:2013-02-27 21:08:22
【问题描述】:

我需要一些帮助,我正在制作基于角色的菜单。我正在使用 LDAP Active Directory 登录。

我可以登录,但我无法从 AD 组中获取角色。

我尝试使用角色提供程序,但无法正常工作。我得到的组使用:

private ArrayList setRoles()
{
    ArrayList rolesList = new ArrayList();
    DirectoryEntry de = new DirectoryEntry("LDAP://**********");
    DirectorySearcher ds = new DirectorySearcher(de);
    ds.PropertiesToLoad.Add("memberOf");
    ds.SearchScope = SearchScope.Subtree;
    ds.Filter = "(sAMAccountName=test)"; // your username

    SearchResult result = ds.FindOne();

    foreach (string g in result.Properties["memberOf"])
        rolesList.Add(g);
    return rolesList;
}

现在,我需要在某处“设置”角色才能使用

User.IsInRole("Admin")

[Authorize role...]
public bla bla bla()

有什么想法、链接等吗?

PD:我正在使用表单身份验证。

【问题讨论】:

    标签: asp.net-mvc active-directory roles


    【解决方案1】:

    您不必手动执行此操作。使用内置角色提供程序应该通过在 web.config 中设置来完成任务。

    Active Directory Membership Provider

    Windows Token Role Provider

    更新:这是 StackOverflow 上的一个问题,涉及使用 ActiveDirectory 成员资格提供程序进行设置,但仍使用表单身份验证。

    ASP.NET MVC - Authenticate users against Active Directory, but require username and password to be inputted

    【讨论】:

    • ups,我忘了说我正在使用表单进行身份验证,所以赢得令牌角色 P 不起作用?
    • 您仍然可以使用 Active Directory 成员资格提供程序并使用表单身份验证来实际获取用户凭据。您只需在控制器操作中使用Membership.ValidateUser(username, password) 验证它们。这是 StackOverflow 上的一个问题,涵盖了这一点。 stackoverflow.com/questions/6147864/…
    【解决方案2】:

    我没有使用 AD 的经验,但是,您需要使用具有角色的 Principal 设置 HttpContext 的 User 属性。

    我之前创建的一种方法是创建一个继承自 AuthorizationAttribute 的自定义授权属性。

    public class AuthorizeActiveDirectoryAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var user = filterContext.HttpContext.User;
    
            //Your code to get the list of roles for the current user
    
            var formsIdentity = filterContext.HttpContext.User.Identity as FormsIdentity;
            filterContext.HttpContext.User = new System.Security.Principal.GenericPrincipal(formsIdentity, rolesList.ToArray());
    
            base.OnAuthorization(filterContext);
        }
    
    }
    

    然后您将其应用到您的操作方法中

    [AuthorizeActiveDirectory role...]
    public bla bla bla()
    

    这也将允许您使用User.IsInRole("Admin")

    【讨论】:

    • 它工作得很好但是......如果我只想检索组/角色 1 次(登录功能)???然后在authorizeDA中使用它们? pd: tks XD
    • 然后在登录页面中,您需要设置一个带有角色的 cookie 并读取每个请求的角色。这本质上是会员提供者和角色提供者的工作方式:您需要在 EACH 请求上重新创建 HttpContext.User。
    • 好的,我猜角色可以存储在会话中???并检查它们是否存在以检索 OnAuthorization()
    • 是的,他们可以。然后在 OnAuthorization() 上,您将获取它们并使用它来创建 GenericPrincipal。
    猜你喜欢
    • 1970-01-01
    • 2010-11-20
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    相关资源
    最近更新 更多