我在周末使用自定义身份验证实现了自定义RoleProvider。使用Silverlight业务模板,我能够在服务请求上添加[RequiresRole(“Admin”)]属性:
[RequiresRole("Admin")]
public IQueryable<P_BUDGET> GetBudgets()
{
return this.ObjectContext.P_BUDGET;
}
这就像一个魅力。我使用了以下代码
然后我放弃了Kyle McClellans授权库。如果我在我的XAML(s:Authorization.RequiresRole =“Admin”)中的HyperlinkButton上设置了“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,我读过的不是你应该修改的东西。
感谢您的帮助!
答案 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)
Roles
是UserBase
类继承的属性,该类在支持Web项目(User
文件夹)中定义。默认情况下,这使用表单身份验证机制,有关用户,配置文件,“角色”等的数据存储在本地数据库中(在Models/User
文件夹中)。为此,我建议您覆盖此属性以返回所需的特定角色,并且还应将Forms Authentication设置为使用您自己的用户数据。
希望这会有所帮助:)
答案 3 :(得分:0)
感谢你们的回答,但我在Kyle McClellan的回答中找到了解决方案here。我已经覆盖了GetAuthenticatedUser,其中一部分包括从db获取我的角色。很简单,我必须放置user.Roles = roles,其中roles是从我的db视图返回的角色列表。