在我的应用中,我需要检查loggind用户的角色,以确定用户是否可以看到某些控件
首先我使用MS的登录视图模板,但由于我没有用户db,因此不会使用db 所以我无法添加角色提供程序,因此我无法使用Role类来检查users \ role
在我的情况下,我有一个会话,其中包含用户信息和他拥有的角色,我需要检查这些角色,以设置哪些控件将启用给用户,但标准方式是“在课堂上使用.net”或代码“
答案 0 :(得分:7)
如果要使用部分asp.net成员资格/身份验证/授权服务,则需要实现自定义角色提供程序以执行角色成员资格检查。
要做的第一件事是创建一个继承自System.Web.Security.RoleProvider
的类,其中听起来像您最初关心的方法是:
所以,你最终会得到类似的东西:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
public class MyCustomRoleProvider : RoleProvider
{
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
}
public override string[] GetRolesForUser(string username)
{
}
public override string[] GetUsersInRole(string roleName)
{
}
public override bool IsUserInRole(string username, string roleName)
{
return GetUsersInRole(roleName).Contains(username);
}
}
注意:Visual Studio将显示许多方法,例如GetAllRoles
和throws new NotImplementedException()
,但我之前写过“最小”角色提供程序,只需要实现我上面列出的方法。这是针对“只读”角色,但Web应用程序没有更新它们。
然后,您需要将roleManager
元素添加到web.config
下的system.web
文件中,如下所示:
<roleManager defaultProvider="NameOfYourRoleProvider" enabled="true">
<providers>
<clear />
<add name="NameOfYourRoleProvider" type="Namespace.To.Your.Class.And.Class.Name, Name.Of.Assembly.Containing.Your.RoleProvider" />
</providers>
</roleManager>
要记住的一点是RoleProvider
实例是由底层的asp.net基础架构创建的,因此您需要通过HttpContext.Current.Session
访问会话数据(并检查{ {1}}在使用之前不为空),这将需要您的提供商代码中的HttpContext.Current
。
答案 1 :(得分:4)
您的问题并不是很清楚,但如果您想提供自己的逻辑来决定用户所属的角色,那么您可以按照以下方式执行此操作:
使用您自己的自定义逻辑填写以下两种方法:
public class MyRoleProvider : System.Web.Security.RoleProvider
{
public override string[] GetRolesForUser(string username)
{
// check a database or an xml file etc.
}
public override bool IsUserInRole(string username, string roleName)
{
// check a database or an xml file etc.
}
}
然后,将以下内容添加到您的web.config:
<roleManager enabled="true" defaultProvider="MyRoleProvider">
<providers>
<clear />
<add name="MyRoleProvider" type="MyNameSpace.MyRoleProvider, MyProjectOrAssemblyName" />
</providers>
</roleManager>
(根据名称替换值)