Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ASP MVC中的自定义角色提供程序_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

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;
}