我正在为我们的 MVC 应用程序开发基于声明的授权原型。我们使用 Asp.Net Identity 进行身份验证。

我们希望对每个控制器操作都有一个声明,然后给予/拿走用户的声明,这样我们就可以很好地控制谁可以去哪里。

我们的应用程序已经有 800 多个操作,并且还在不断增长。我制作了一个小测试应用程序来看看如何处理这么多的索赔。并遇到一个问题: cookie 限制为 4092 字节.

并且拥有大量的声明会增加Identity Authentication cookie。大约 600 个带有短名称/值(每个 5 个字符)的声明为我提供了大小超过 4K 的 cookie,并且具有此数量声明的用户无法登录 - 无法在浏览器中设置 cookie。

600 次索赔并不是我们应用程序的限制。我们可能需要的不止这些。

有没有办法将 auth-cookie 分成几个较小的 cookie?

附注如果你好奇的话,这是我的 索赔“分析器”的代码 随着 项目的其余部分.

附注我知道大 cookie 的性能影响。现在不用担心。

更新 目前我的答案没有现成的解决方案。但看来我并不是唯一有这个问题的人。 Microsoft.Owin 正在处理 auth-cookie。Owin.Cookies 的当前源代码有 分块Cookie管理器 默认分配在 Cookie身份验证中间件.

坏消息是该代码非常新鲜(于 2014 年 7 月 10 日签入,仅 20 天)。它可以通过 nuget 预发布获得 Microsoft.Owin.Security.Cookies. 。不确定我是否想在生产站点中使用 RC2。

还有其他办法吗?

有帮助吗?

解决方案 2

我还没有解决直接问题。Cookie 太大,并且会随着大量或索赔而保持很大。Owin v3.0(目前处于 RC2 阶段,尚未准备好生产)有一种将 cookie 分成更小的块的方法。但大饼干就不好了。所以我只在服务器端保留声明。

我曾有一个 身份论坛上的讨论 并发现 问题完全解决了我的问题。根据这个问题,我已经完成了自己的解决方案并制作了一个小型 MVC 应用程序的原型: https://github.com/trailmax/ClaimsAuthorization.

解决方案的核心在于 启动例程 并且有一个 MVC过滤器 检查用户是否可以使用所需的声明。

其他提示

您错误地使用了声明。声明代表用户的身份,而不是允许他们执行的操作。您遇到了问题,因为您将声明视为用户权限的房子。您确实应该找到一种方法在应用程序中将两者分开。

在 MVC 方式中,这将创建一个自定义授权属性,从声明 cookie 中获取用户的身份,并验证用户的身份是否可以执行某些操作。

请参阅下面的相关问题。

限制对记录的访问。基于声明的权限是个好主意吗

声明特定资源的授权

你应该使用角色

[Authorize(Roles = "Admin, Role1")]
  public ActionResult Index(string id)
{....}
[Authorize(Roles = "Admin, Role2")]
  public ActionResult Index2(string id)
{....}
[Authorize(Roles = "Admin, Role1, Role3")]
  public ActionResult Index3(string id)
{....}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top