【问题标题】:Setting user roles in controllers?在控制器中设置用户角色?
【发布时间】:2011-04-25 06:12:01
【问题描述】:

我需要能够在我的控制器中手动授权我的用户。
我从 AD 获得身份验证,然后在我的控制器中,
我要上图 我从 AD 获得的用户 ID 到我的应用程序的内部用户 ID。
从 UserRole 表中获取 userId,然后在控制器中设置它,但是,
我不知道如何在控制器中设置角色?

我已尝试在我的家庭控制器中执行此操作:
HttpContext.User = new System.Security.Principal.GenericPrincipal(User.Identity, roleName);

roleName 设置为“Admin”,但这似乎不起作用,因为它总是无法授权。

请帮忙?....

【问题讨论】:

    标签: asp.net-mvc roles


    【解决方案1】:

    假设您在控制器方法中使用[Authorize],这将在操作方法之前运行,因此不会到达您必须设置角色名称的代码 - 它需要在之前设置控制器被调用。

    将这样的方法添加到您的 Global.asax:

    protected void Application_OnPostAuthenticateRequest(Object sender, EventArgs e)
    {
        IPrincipal contextUser = Context.User;
    
        if (contextUser.Identity.AuthenticationType == "Forms")
        {
            // determine role name
    
            // attach to context
            HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(User.Identity, roleName);
            Thread.CurrentPrincipal = HttpContext.Current.User;
        }
    }
    

    【讨论】:

    • 嗨 Clicktricity,感谢您的回复。我认为这行不通,因为我使用 ADFS 对我的用户进行身份验证。因此,I 身份验证模式不是基于表单的,因此“if”语句将始终为假。我弄错了吗?
    • 很公平 - 只需适应您的需求。关键是当前用户分配发生在 OnPostAuthenticationRequest 期间
    • 这种方法不会在您每次尝试访问某些控制器时始终检查用户的角色吗?有没有办法将用户的角色存储在会话对象或某种 cookie 中?这样您就不需要总是为用户角色查找数据库?
    • 由您决定如何确定用户的角色。一个 cookie 是合理的,只要它被加密以防止有人伪造它并获得管理员访问权限。您还需要确定 cookie 的保留时间,否则不应再具有管理员访问权限的人仍然可以访问管理区域。
    • 好建议!我想知道您是否有任何链接或资源可以发给我?我不知道如何使用管理员角色身份验证来加密 cookie?任何帮助将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-11
    • 1970-01-01
    • 2016-05-17
    • 2018-03-11
    • 2020-05-04
    • 2015-01-31
    相关资源
    最近更新 更多