MVC5基于声明的身份验证 - 适合的声明项

5

我刚开始在现有的Web应用程序上使用基于声明的安全性。我有很多与身份相关的项目,如电子邮件和名字,但还有其他安全相关的项目,我不确定是否应该放在这里。

例如,有许多细粒度的布尔权限用于不同区域的站点,我不确定应该放在哪里。例如 - CanAccessXCanAccessYCanAccessZ等。

有人能告诉我这些项目是否适合转换为声明,还是应该放在其他地方?

其次,由于所有声明都被序列化到cookie中,如果将其装满太多声明,这是否是一个坏主意?在哪个阶段会检索额外的声明并仅在cookie中放置一小部分声明?

谢谢。


您放入 cookie 中的自定义部分应该没问题,但是它应该在一定时间间隔后过期。 - Ross Bush
你可以像这样做:new Claim("http://schemas.example.com/identity/claims/permission", "CanAccessX"),但是可能会出现cookie过多的问题。如果我没记错的话,你可以使用SessionAuthenticationModule来处理cookie;甚至还有一种现代的“OWIN cookie authentication middleware”方法。 - Axel Heer
@AxelHeer 谢谢,我知道我可以这样做,但我更想知道在这种情况下,安全信息是否最好作为声明来处理。 - Grant
1个回答

4
将权限转换为声明通常是一个好主意,如果它符合应用程序的要求。声明式安全性的一个好处是用户元数据(名称、角色、年龄、权限等)与应用程序安全性需求之间的解耦。例如,如果某个“操作”需要用户达到一定年龄,只需要进行简单的检查 HasClaim(c => c.Type == Age && c.Value >= 18) 即可。如果它需要一个简单的权限,为什么不直接检查 HasClaim(CanAccessX)
许多应用程序使用组/角色,如“CanAccessX”/“CanReadY”/“CanWriteZ”来实现一个较不复杂(更好的)的安全机制。使用声明,这个概念变得更加自然。
其次,cookie过大可能会成为一个问题。例如,如果用户具有太多组/角色/权限/其他内容,则Kerberos令牌过大可能会成为一个问题。解决这个问题的一种方法是在声明式安全性前面使用基于角色的安全性:如果有n个角色对应m个权限(n应该远小于m),则只需将n个角色写入cookie中,但在简单的模块/中间件内部进行转换。另一种解决方案可能是自定义身份验证/权限映射,这样您只需将用户的身份验证信息写入cookie中,但在实际处理请求之前匹配其(缓存的)权限。
我会从直接的方法开始(只需将所有声明写入cookie中)。然后,如果它变得过大并影响应用程序的性能,您可以使用更多或更少复杂的模块/中间件来优化其行为,而不会影响实际的“代码”。
请注意,已经有.NET机制安全地处理那些cookie:对于经典(当前)IIS应用程序,您可以使用Session Authentication Module,对于现代(未来)OWIN应用程序,您可以使用Cookie Authentication Middleware

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接