我们有一个asp net mvc web应用程序。我们使用过的Auth模式是这样的。每个用户都有一个角色,该角色拥有声明。当用户登录时,我们通过他的角色获取用户拥有的所有声明,并将它们添加到会话中的后续用户主体。 每个控制器端点也都有一个特定的声明。每当控制器中的安全端点被命中时,我们都有一个自定义的Auth属性,我们在其中检查登录用户是否具有指定控制器方法的相同声明。
ProductController.cs
[MyAuthorize(claim = "Create Product")]
public IHttpActionResult CreateProduct(ProductModel model)
{
}
MyAuthorize.cs
public class MyAuthorize: AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
// Get user principal from session
// Check if this.claim is there among that pricipal's claims.
}
public string claim { get; set; }
}
问题是系统中的索赔数量正在快速增长(100s)。我们将它们作为用户主要存储在用户会话中 当我们决定将jwt与身份用于web api 2应用程序(following this)并使用该mvc的相同管理器层时,它变得更大。因为将所有声明放入jwt令牌是不可行的。所以我们考虑只在jwt中放置角色,然后从像MyAuthorize这样的类似属性的redis db中获取该角色的声明。 有没有更好的方法来做到这一点?