当角色分配发生变化时,授权令牌仍会向用户提供旧角色
When role assignment changes, authorization token still presents a user with the old roles
我基本上拥有此处描述的设置:http://blogs.msdn.com/b/martinkearn/archive/2015/03/25/securing-and-working-securely-with-web-api.aspx
问题在于,如果在收到令牌后修改了用户的角色,除非用户再次登录并收到新令牌,否则更改不会反映出来。
例如:
- 用户的角色是 "ABC"
- 用户登录,收到令牌
- 用户使用令牌访问装饰有 [Authorize(Roles="ABC")] 的端点(如预期)
- 管理员取消了用户的角色 "ABC"
- 用户仍然可以使用令牌访问装饰有 [Authorize(Roles="ABC")](意外)
的端点
- 用户丢弃令牌,重新登录,收到新令牌
- 用户使用新令牌访问装饰有 [Authorize(Roles="ABC")] 的端点并获得 401(如预期)
换句话说,除非用户请求新令牌(再次登录),HttpContext.Current.User.IsInRole("ABC") returns true,即使 AspNetUserRoles table显示用户没有该角色。
当对 AspNetUserRoles 进行更改时,如何更新(或者可能使令牌无效?)table?
令牌存储身份信息(用户名、id)以及用户在登录时拥有的所有角色。它这样做是为了不必每次需要时都访问数据库以获取用户信息检查权限,但它的缺点是角色信息更改时不会更改。
如果您对每次访问数据库都满意,我会通过继承 AuthorizeAttribute 并覆盖 OnAuthorization 方法来构建自定义授权属性。如果您不想在每次角色检查时都访问数据库,您仍然可以填充角色最近更改时间的缓存,并且仅当该用户的角色更新日期晚于票证日期时才访问数据库。
例如:
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,
});
}
}
我基本上拥有此处描述的设置:http://blogs.msdn.com/b/martinkearn/archive/2015/03/25/securing-and-working-securely-with-web-api.aspx
问题在于,如果在收到令牌后修改了用户的角色,除非用户再次登录并收到新令牌,否则更改不会反映出来。
例如:
- 用户的角色是 "ABC"
- 用户登录,收到令牌
- 用户使用令牌访问装饰有 [Authorize(Roles="ABC")] 的端点(如预期)
- 管理员取消了用户的角色 "ABC"
- 用户仍然可以使用令牌访问装饰有 [Authorize(Roles="ABC")](意外) 的端点
- 用户丢弃令牌,重新登录,收到新令牌
- 用户使用新令牌访问装饰有 [Authorize(Roles="ABC")] 的端点并获得 401(如预期)
换句话说,除非用户请求新令牌(再次登录),HttpContext.Current.User.IsInRole("ABC") returns true,即使 AspNetUserRoles table显示用户没有该角色。
当对 AspNetUserRoles 进行更改时,如何更新(或者可能使令牌无效?)table?
令牌存储身份信息(用户名、id)以及用户在登录时拥有的所有角色。它这样做是为了不必每次需要时都访问数据库以获取用户信息检查权限,但它的缺点是角色信息更改时不会更改。
如果您对每次访问数据库都满意,我会通过继承 AuthorizeAttribute 并覆盖 OnAuthorization 方法来构建自定义授权属性。如果您不想在每次角色检查时都访问数据库,您仍然可以填充角色最近更改时间的缓存,并且仅当该用户的角色更新日期晚于票证日期时才访问数据库。
例如:
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,
});
}
}