我基本上有这里描述的设置:http://blogs.msdn.com/b/martinkearn/archive/2015/03/25/securing-and-working-securely-with-web-api.aspx
问题是,如果在收到令牌后修改了用户的角色,则除非用户再次登录并收到新令牌,否则不会反映更改。
例如:
换句话说,除非用户请求新令牌(再次登录),否则HttpContext.Current.User.IsInRole(" ABC")将返回true,即使AspNetUserRoles表显示用户不是有这个角色。
在对AspNetUserRoles表进行更改时,如何更新(或可能使作者无效?)令牌?
答案 0 :(得分:1)
令牌存储身份信息(用户名,ID)以及用户登录时的所有角色。这样做是为了使每次需要检查权限时都不必在数据库中查找用户信息,但它的缺点是在角色信息发生变化时不会改变。
如果您每次都能访问数据库,我会通过继承AuthorizeAttribute并覆盖OnAuthorization方法来构建自定义Authorize属性。如果您不想在每个角色检查中访问数据库,您仍然可以填充角色最近更改时的缓存,并且只有在该用户的角色更新日期晚于票证日期时才会访问数据库。 / p>
例如:
public class CustomAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!filterContext.HttpContext.Request.IsAuthenticated)
{
// Redirect to login page
filterContext.Result = Redirect("Login", "Index");
return;
}
var roles = GetRolesFromDb();
if (!Roles.Any(r => roles.Contains(r)))
filterContext.Result = Redirect("Error", "AccessDenied");
}
private RedirectToRouteResult Redirect(string controller, string action, string area = "")
{
return new RedirectToRouteResult(new RouteValueDictionary(new
{
controller,
action,
area,
});
}
}