我的自定义角色提供者出现了问题" string [] GetRolesForUser(string username)"方法,但进程不经过它。我的代码是:
控制器(只是其中一部分):
[Authorize(Roles="Administrator")]
public class UsersController : AdminBaseController
{
private IUsersRepository users;
private IDepartmentsRepository departments;
public UsersController()
{
this.users = new UsersRepository(new TicketsContext());
this.departments = new DepartmentsRepository(new TicketsContext());
}
}
自定义角色提供程序:
public class CustomRoleProvider : RoleProvider
{
public override bool IsUserInRole(string username, string roleName)
{
var userRoles = GetRolesForUser(username);
return userRoles.Contains(roleName);
}
public override string[] GetRolesForUser(string username)
{
//Return if the user is not authenticated
if (!HttpContext.Current.User.Identity.IsAuthenticated)
return null;
//Return if present in Cache
var cacheKey = string.Format("UserRoles_{0}", username);
if (HttpRuntime.Cache[cacheKey] != null)
return (string[])HttpRuntime.Cache[cacheKey];
//Get the roles from DB
var userRoles = new string[] { };
var user = db.Users.Where(u => u.email == username).FirstOrDefault();
if (user != null)
{
if(user.access_level == 0)
{
userRoles = new[] { "Administrator" };
}
else
{
userRoles = new[] { "Normal" };
}
}
//Store in cache
HttpRuntime.Cache.Insert(cacheKey, userRoles, null, DateTime.Now.AddMinutes(_cacheTimeoutInMinutes), Cache.NoSlidingExpiration);
// Return
return userRoles.ToArray();
}
}
的Web.config
<!-- Custom Role Provider -->
<roleManager enabled="true" defaultProvider="TicketsRoleProvider">
<providers>
<add name="TicketsRoleProvider"
type="Tickets.CustomRoleProvider"
cacheTimeoutInMinutes="30" />
</providers>
</roleManager>
我无法让它工作,我不知道为什么。
任何人都可以帮我吗?
由于
答案 0 :(得分:0)
我看不到任何明显的东西,但我会:
删除对&#34; HttpContext.Current.User.Identity.IsAuthenticated&#34;的检查。在GetRolesForUser方法中。此方法应该只获取作为参数提供的用户名的角色。
要进行调试,我首先要检查控制器操作方法中的HttpContext.Current.User.GetType()
(一个不受保护的方法)。它是System.Web.Security.RolePrincipal
类型吗?
您应该在自定义IsUserInRole
中实施RoleProvider
。实现只需检查提供的角色是否在GetRolesForUser
返回的数组中。我不认为这是您的问题:IsUserInRole
RolePrincipal
未使用System.ServiceModel.Security.RoleProviderPrincipal
(如果您在HttpContext.Current.User
中使用ASP.NET角色WCF服务,无论如何都是一个好主意。
<强>更新强>
您已确认RolePrincipal
是ProviderName
。我建议你使用调试器仔细检查它。特别是检查:
Identity
属性,该属性应与自定义RoleProvider的名称相匹配。
HttpContext.Current.User.IsInRole
属性,该属性应与当前用户的名称相匹配。
您也可以尝试从控制器中的代码调用RolePrincipal.SetDirty()
。第一次调用它时,它应该调用您自定义的RoleProvider的GetRolesForUser方法。
您还可以尝试调用IsInRole
方法:这会将缓存的角色列表标记为已更改,下次调用GetRoles
或where END_DATE between '" + asOfDate.AddDays(-30).ToShortDateString() + "' and '" +
时应调用您的自定义RoleProvider&#39 ;再次使用GetRolesForUser方法。