【问题标题】:Custom Role Provider Could not find stored procedure 'dbo.aspnet_CheckSchemaVersion'. on [Authorize(Roles = "Admin")] attribute自定义角色提供程序找不到存储过程“dbo.aspnet_CheckSchemaVersion”。在 [Authorize(Roles = "Admin")] 属性上
【发布时间】:2013-12-11 14:06:28
【问题描述】:

我有一个带有 Entity Framework 5MVC 4 Web 应用程序。

我一直在尝试为具有完全不同类型的访问权限的角色实施授权,但想使用我自己的数据库结构。我已经编写了自定义成员资格和角色提供程序,并实现了它们。

我认为我没有成功地实现这些提供程序,或者没有正确禁用 simplemembership。

当我将 [Authorize(Roles = "Admin")] 属性应用于控制器时,我收到以下错误消息:

“/”应用程序中的服务器错误。 找不到存储过程“dbo.aspnet_CheckSchemaVersion”。

我要做的就是在允许对面板进行任何访问之前检查经过身份验证的用户是否具有管理员角色。

我的 Web.config:

<system.web>
  <roleManager enabled="true" defaultProvider="CustomRoleProvider" cacheRolesInCookie="true">
    <providers>
      <clear />
      <add name="CustomRoleProvider" type="System.Web.Security.SqlRoleProvider" connectionStringName="DefaultConnection" applicationName="CostaPropertyServices" />
    </providers>
  </roleManager>

我的 CustomRoleProvider:

namespace CostaPropertyServices.Models
{
    public class CustomRoleProvider : RoleProvider
    {
        .... // Code skipped for brevity
        public override string[] GetRolesForUser(string username)
        {
            using (var db = new PropertyInfoEntities())
            {
                var user = db.Users.SingleOrDefault(u => u.Username == username);
                if (user == null)
                    return new string[] { };
                return user.Roles == null ? new string[] { } :
                  user.Roles.Select(u => u.Name).ToArray();
            }
        }

        public override string[] GetUsersInRole(string roleName)
        {
            throw new NotImplementedException();
        }

        public override bool IsUserInRole(string username, string roleName)
        {
            using (var db = new PropertyInfoEntities())
            {
                var user = db.Users.SingleOrDefault(u => u.Username == username);
                if (user == null)
                    return false;
                return user.Roles != null && user.Roles.Any(r => r.Name == roleName);
            }
        }

有谁知道我做错了什么? 谢谢。

编辑:

我认为问题是自从找到this similar question 后我没有正确连接会员提供程序,但找不到我出错的地方。

【问题讨论】:

    标签: asp.net asp.net-mvc-4 asp.net-membership roleprovider


    【解决方案1】:

    根据您的 web.config 文件,您没有使用自定义角色提供程序。

    类型应该是type="CostaPropertyServices.Models.CustomRoleProvider, CostaPropertyServices"

    <system.web>
      <roleManager enabled="true" defaultProvider="CustomRoleProvider" 
          cacheRolesInCookie="true">
        <providers>
          <clear />
          <add name="CustomRoleProvider" 
               type="CostaPropertyServices.Models.CustomRoleProvider" 
               connectionStringName="DefaultConnection" 
               applicationName="CostaPropertyServices" />
        </providers>
      </roleManager>
    

    【讨论】:

    • 就知道这样的愚蠢错误!我被困了2天哈哈!谢谢胜利
    【解决方案2】:

    如果您已经实现了新的ASP.NETIdentity,那么您正在寻找的是:

    var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));
    

    【讨论】:

      猜你喜欢
      • 2011-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多