我在 ASP.net MVC4 中遇到了自定义角色提供程序的问题。我实现了一个非常轻量级的 RoleProvider,它在我改变之前似乎工作正常
[Authorize]
public class BlahController:....
}
到
[Authorize(Roles="Administrator")]
public class BlahController:....
}
一旦我进行了更改,用户就不再经过身份验证,并且出现 401 错误。这很奇怪,因为我的 RoleProvider 基本上为 IsUSerInRole 返回 true,并且为 GetUserRoles 返回一个包含“Administrator”的列表。我在自定义 RoleProvider 中的每个方法上都设置了断点,但发现没有一个被调用。
接下来我实现了我自己的从 AuthorizeAttribute 继承的授权属性。在这我设置了断点,这样我就可以看到发生了什么。事实证明,底层属性调用的 User.IsInRole() 返回 false。
我相信角色提供者已正确设置。我的配置文件中有这个
<roleManager enabled="true" defaultProvider="SimplicityRoleProvider">
<providers>
<clear />
<add name="SimplicityRoleProvider" type="Simplicity.Authentication.SimplicityRoleProvider" applicationName="Simplicity" />
</providers>
</roleManager>
并使用此处描述的方法检查哪个角色提供者是当前角色提供者:参考当前 RoleProvider 实例?产生正确的结果。但是 User.IsInRole 坚持返回 false。
我正在使用 Azure 访问控制服务,但我看不出这与自定义角色提供程序有何不兼容。
我可以做些什么来更正 IPrincipal 用户,以便 IsInRole 从我的自定义 RoleProvider 返回值?
角色提供者来源:
公共类 SimplicityRoleProvider : RoleProvider { private ILog log { get; 放; }
public SimplicityRoleProvider()
{
log = LogManager.GetLogger("ff");
}
public override void AddUsersToRoles(string[] usernames, string[] roleNames)
{
log.Warn(usernames);
log.Warn(roleNames);
}
public override string ApplicationName
{
get
{
return "Simplicity";
}
set
{
}
}
public override void CreateRole(string roleName)
{
}
public override bool DeleteRole(string roleName, bool throwOnPopulatedRole)
{
return true;
}
public override string[] FindUsersInRole(string roleName, string usernameToMatch)
{
log.Warn(roleName);
log.Warn(usernameToMatch);
return new string[0];
}
public override string[] GetAllRoles()
{
log.Warn("all roles");
return new string[0];
}
public override string[] GetRolesForUser(string username)
{
log.Warn(username);
return new String[] { "Administrator" };
}
public override string[] GetUsersInRole(string roleName)
{
log.Warn(roleName);
return new string[0];
}
public override bool IsUserInRole(string username, string roleName)
{
log.Warn(username);
log.Warn(roleName);
return true;
}
public override void RemoveUsersFromRoles(string[] usernames, string[] roleNames)
{
}
public override bool RoleExists(string roleName)
{
log.Warn(roleName);
return true;
}
}