我有实体框架5 的 MVC 4 网络应用程序。
我一直在尝试为具有完全不同类型访问权限的角色实施授权,但希望使用我自己的数据库结构。我编写了自定义成员资格和角色提供程序,并实现了它们。
我认为我没有设法正确实施这些提供商,或者没有正确禁用简单会员。</ p>
当我将[Authorize(Roles =“Admin”)]属性应用于Controller时,收到以下错误消息:
>'/'应用程序中的服务器错误。 找不到存储过程'dbo.aspnet_CheckSchemaVersion'。
我想要做的就是在允许任何访问面板之前检查经过身份验证的用户是否处于Admin角色。
我的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后我没有正确连接会员提供商,但找不到我出错的地方。
答案 0 :(得分:2)
根据您的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>
答案 1 :(得分:1)
如果您已实施新的ASP.NET
Identity
,那么您要找的是:
var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext()));