2

我在周末实现了一个带有自定义身份验证的自定义 RoleProvider。使用 Silverlight 业务模板,我能够将 [RequiresRole("Admin")] 属性放在服务请求上:

[RequiresRole("Admin")]
public IQueryable<P_BUDGET> GetBudgets()
{
    return this.ObjectContext.P_BUDGET;
}

这就像一个魅力。我使用了以下代码

然后我访问了 Kyle McClellans 授权库。如果我在 XAML (s:Authorization.RequiresRole="Admin") 中的 HyperlinkBut​​ton 上设置“RequiresRole”属性,它会在应用加载时成功隐藏按钮。当我登录时,我希望它能够识别我的测试用户所在的“管理员”角色,最终将该 HLB 的可见性更改为 true。但是,当我单步执行代码时,我进入了我的 App.Web.g.cs 文件,它具有以下功能:

public bool IsInRole(string role)
    {
        if ((this.Roles == null))
        {
            return false;
        }
        return global::System.Linq.Enumerable.Contains(this.Roles, role);
    }

在上面的代码中,this.Roles 为空。我在这里想念什么?第一个代码块使用我已经覆盖的“GetRolesForUser”方法,并从我的数据库中的视图返回角色列表。第二个使用了 IsInRole,我读过的不是你应该修改的东西。

感谢您的帮助!

4

4 回答 4

1

您的自定义角色提供者应该负责从您的数据库中生成角色列表或通过数据库调用验证用户是否在角色中

看看微软的这个示例代码:http: //msdn.microsoft.com/en-us/library/system.web.security.roleprovider.isuserinrole.aspx

于 2011-03-08T04:38:54.067 回答
0

感谢大家的回答,但我在这里通过凯尔麦克莱伦在他自己的回答中发表的评论找到了解决方案。我已经覆盖了 GetAuthenticatedUser,其中一部分包括从数据库中获取我的角色。很简单,我必须输入 user.Roles = roles,其中角色是从我的 db 视图返回的角色列表。

于 2011-03-08T18:55:34.947 回答
0

我已经实现了我的自定义角色提供程序,您需要在 global.asax, int Application_Start 方法中创建角色。我有这样的事情:

void Application_Start(object sender, EventArgs e) 
{
    Roles.ApplicationName = "MyAppName";

    if (!Roles.RoleExists("admin"))
        Roles.CreateRole("admin");

    if (!Roles.RoleExists("operator"))
        Roles.CreateRole("operator");

    if (!Roles.RoleExists("user"))
        Roles.CreateRole("user");
}

祝你好运。

于 2011-03-07T23:59:37.677 回答
0

Roles在这种情况下,是由支持 Web 项目(文件夹)中定义的UserBase类继承的类的属性。默认情况下,这使用表单身份验证机制,并且有关用户、配置文件、“角色”等的数据存储在本地数据库中(在文件夹中)。为此,我建议您覆盖此属性以返回您需要的特定角色,并且您还应该将表单身份验证设置为使用您自己的用户数据。UserModels/UserApp_Data

希望这可以帮助 :)

于 2011-03-08T16:19:28.983 回答