C# ASP MVC中的自定义角色提供程序
您好,我有点迷路了,我不知道该怎么办: 问题是,我的应用程序仍然没有检测到分配的角色。 比如说如果我有C# ASP MVC中的自定义角色提供程序,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,您好,我有点迷路了,我不知道该怎么办: 问题是,我的应用程序仍然没有检测到分配的角色。 比如说如果我有 [授权(Roles=“user”)]。它不会检测到我的登录,也不允许我继续查看该视图 我一直在遵循一个糟糕的教程,以下是到目前为止我必须做的: (我想先做一个,至少在我继续下一个之前) 以下是我的数据库表: 为了简单起见,我还没有添加任何哈希: 登录表 public override bool IsUserInRole(string uname, string roleName) {
[授权(Roles=“user”)]
。它不会检测到我的登录,也不允许我继续查看该视图
我一直在遵循一个糟糕的教程,以下是到目前为止我必须做的:
(我想先做一个,至少在我继续下一个之前)
以下是我的数据库表:
为了简单起见,我还没有添加任何哈希:
登录表
public override bool IsUserInRole(string uname, string roleName)
{
var userRoles = GetRolesForUser(uname);
return userRoles.Contains(roleName);
}
角色表
public override bool IsUserInRole(string uname, string roleName)
{
var userRoles = GetRolesForUser(uname);
return userRoles.Contains(roleName);
}
我使用内部连接
,我会有这样的东西
选择A.username,A.role从登录A内部加入A.role=B.id上的角色B
我使用代码优先EF 4.0,以下是我的代码片段:
我有一个类roleprovider
,它继承自roleprovider
我仅从中实现了两个方法,即:GetRolesForUser
和IsUserInRole
GetRolesForUser
public override string[] GetRolesForUser(string uname)
{
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
return null;
}
var cacheKey = string.Format("{0_role}", uname);
if (HttpRuntime.Cache[cacheKey] != null)
{
return (string[])HttpRuntime.Cache[cacheKey];
}
string[] roles = new string[] { };
using (EmployeeContext emp = new EmployeeContext())
{
roles = (from a in emp.login
join b in emp.roles on a.role equals b.id
where a.username.Equals(uname)
select b.role).ToArray<string>();
if (roles.Count() > 0)
{
HttpRuntime.Cache.Insert(cacheKey, roles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinute), Cache.NoSlidingExpiration);
}
}
return roles;
}
Web.Config
<roleManager>
<providers>
<clear/>
<add name="roleprovider" type="MvcApplication6.Helper.roleprovider"/>
</providers>
</roleManager>
查看您发布的代码的一些提示 您的web.config应该类似于:
<roleManager enabled="true" defaultProvider="roleprovider">
<providers>
<clear/>
<add name="roleprovider" type="MvcApplication6.Helper.roleprovider"/>
</providers>
</roleManager>
此方法的目的是获取作为参数传递的用户名的角色-它不应该与当前用户有关
如果这不起作用,请尝试在
GetRolesForUser
方法中设置断点。通过修复我的Web.Config解决了这个问题(然后一切都神奇地工作了)。它无法工作,因为名称空间混乱。完全归功于Joe的想法。“应用程序不会从数据库中检测角色”有点含糊不清。到底发生了什么?即使我有[Authorize(Roles=“users”)]并且我当前的登录角色是用户
,它也不允许我继续。让我来编辑我的帖子。我以前尝试过你的web配置,但是我得到了类似于解析器错误的东西。我必须使用这个来避免它。这里有一个链接:@Carlo-错误消息说它找不到你的自定义roleprovider类。这比你现在所拥有的进步了一步,因为它至少在尝试加载它。您需要检查提供程序类的名称(包括命名空间)以及包含它的程序集的名称是否与web.config中的名称匹配。在哪里可以找到该程序集?还有名称空间,不是应该是mvcapapplication6.Helper.roleprovider
?我的项目结构可以从我的另一个SO问题中找到。你不应该接受另一个问题的错误答案。名称空间位于源文件roleprovider.cs中,默认情况下,您发布的项目结构的完整类名将是mvcapapplication6.roleprovider。
if (!HttpContext.Current.User.Identity.IsAuthenticated)
{
return null;
}