IsInRole的问题 - customRoleProvider

时间:2011-03-07 23:51:51

标签: c# silverlight roleprovider

我在周末使用自定义身份验证实现了自定义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”属性,它会在app load上成功隐藏按钮。当我登录时,我希望它能够识别我的测试用户所处的“管理员”角色,最终将该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为null。我在这里错过了什么?第一个代码块使用“GetRolesForUser”方法,我已经覆盖了该方法,并从我在数据库中的View中返回一个角色列表。第二个使用了IsInRole,我读过的不是你应该修改的东西。

感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

您的自定义角色提供程序应负责从数据库生成角色列表,或通过数据库调用验证用户是否处于角色中

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

答案 1 :(得分: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");
}
祝你好运。

答案 2 :(得分:0)

在这种情况下,

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

希望这会有所帮助:)

答案 3 :(得分:0)

感谢你们的回答,但我在Kyle McClellan的回答中找到了解决方案here。我已经覆盖了GetAuthenticatedUser,其中一部分包括从db获取我的角色。很简单,我必须放置user.Roles = roles,其中roles是从我的db视图返回的角色列表。