MVC 授权角色和 IPrincipal - 它是如何工作的?

Posted

技术标签:

【中文标题】MVC 授权角色和 IPrincipal - 它是如何工作的?【英文标题】:MVC Authorization Role and IPrincipal - how does it work? 【发布时间】:2011-01-29 04:28:44 【问题描述】:

我已经成功地为我的 MVC2 应用程序实现了一个自定义 MembershipProvider。我有自己的 User 表和 Role 表。

我现在的问题是,当我输入 [Authorize(Roles="blah")] 属性时,它不起作用。我进行了一些搜索,但没有找到我正在寻找的明确答案,即 - 此角色授权如何工作?我的 web.config 使用标准的 AspNet 角色提供程序。

我的理解是我必须让我的 User.cs 类实现 IPrincipal 接口,这意味着,添加代码来检查 IsInRole。

我的问题——这是正确的吗?框架如何知道并知道如何获取我的自定义用户对象?我的理解是 Asp.Net 身份验证和授权部分与 MembershipUser 一起使用。

任何提示、想法或链接将不胜感激, 谢谢

【问题讨论】:

我不确定这如何与 MVC 一起使用,但是在 ASP.NET 和 WCF 中,您可以执行以下操作:[PrincipalPermission(SecurityAction.Demand, Role = "RoleName")] [授权(Roles="RoleName")] 【参考方案1】:

您的角色表/代码是 RoleProvider 的实现吗?我相信 IPrincipal 对 web.config 中配置的默认 RoleProvider 起作用。

这个forum post 讨论了如果需要的话,为了实现自己的 IPrincipal 需要做什么。

【讨论】:

【参考方案2】:

好吧,我想我明白了,我只是有点瞎。

由于我创建了自己的自定义 MembershipProvider(具有自己的自定义 User 表和 Role 表),因此我必须实现自定义 RoleProvider。所以,一旦我这样做了,这一切都说得通了,因为 RoleProvider 有 IsUserInRole 方法,即

public override bool IsUserInRole(string username, string roleName)
    
        IUserRepository userRepository = GetUserRepository();
        User user = userRepository.Retrieve(username);

        // and here, my User class implements IPrincipal
        if (user != null && user.IsInRole(roleName)) 
                return true;
        else
            return false;
    

【讨论】:

以上是关于MVC 授权角色和 IPrincipal - 它是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET web api - 设置自定义 IIdentity 或 IPrincipal

在 MVC 中实现自定义身份和 IPrincipal

在 MVC3 中使用自定义 IPrincipal 和 IIdentity

MVC5 中的授权/角色

ASP.NET MVC 5 中的简单角色管理器和授权,无需使用 Identity(CustomRoleProvider)

管理不同的用户角色 ASP.NET MVC [关闭]