我正在为我们的MVC应用程序开发一个基于声明的授权原型。我们使用Asp。用于身份验证的网络标识。
我们希望每个控制器动作都有一个声明,然后给/拿走用户的声明,这样我们就可以很好地控制谁可以去哪里。
我们的应用程序已经有800多个动作,并不断增长。我做了一个小的测试应用程序,看看如何处理这么多的索赔。并且遇到了一个问题:cookie被限制为4092字节。
并且拥有大量声明会增加身份验证cookie。大约600个短名称/值的声明(每个5个字符)给我的cookie大小超过4K,有这个数量的声明的用户无法登录- cookie不能在浏览器中设置。
600索赔不是我们应用程序的限制,我们可能需要更多。
是否有办法将auth-cookie分成几个较小的cookie ?
注。如果你很好奇,这里是我的声明"分析器"的代码以及项目的其余部分。
最大功率。我知道大型cookie对性能的影响。现在不用担心。
Update目前我的答案没有开箱即用的解决方案。但看起来我不是唯一一个有这个问题的人。Microsoft.Owin
正在处理auth-cookie。以及Owin的当前源代码。cookie有ChunkingCookieManager,它在CookieAuthenticationMiddleware中默认分配。
坏消息是这个代码非常新鲜(在2014年7月10日检入,只有20天)。它可以通过nuget microsoft . win. security . cookies的预发布版本获得。我不确定我是否想在生产站点中使用RC2。
还有别的办法吗?
您错误地使用了声明。声明表示用户的身份,而不是允许他们执行的操作。您正在遇到问题,因为您将索赔视为用户权限的房子。你真的应该在你的应用程序中找到一种方法把这两者分开。
在MVC模式中,这将是创建一个自定义授权属性,从声明cookie中获取用户的身份,并验证用户的身份可以执行某些操作。
参见下面的相关问题。
限制对记录的访问。基于声明的权限是个好主意吗
请求特定资源的授权
我还没有解决这个直接问题。Cookie太大,并且随着数量或请求的增加,它将保持较大。Owin v3.0(目前在RC2中,还没有生产就绪)有一种方法可以将cookie分成更小的cookie。但是大的饼干是不好的。所以我只在服务器端保存声明。
我在身份论坛上进行了讨论,发现这个问题完全解决了我的问题。基于这个问题,我已经完成了我自己的解决方案,并原型化了一个小MVC应用程序:https://github.com/trailmax/ClaimsAuthorisation.
解决方案的核心是在Startup例程中,并且有一个MVC过滤器,用于检查所需的声明是否可供用户使用。
应该使用Role
<>之前[授权(角色= "Admin, Role1")]public ActionResult Index(string id){…}[授权(角色= "Admin, Role2")]public ActionResult Index2(string id){…}[授权(角色= "Admin, Role1, Role3")]public ActionResult Index3(string id){…}