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

MVC5 Claims Based Authentication - Suitable claim items

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

例如,网站的不同区域有许多精细的布尔权限,我不确定该放在哪里。例如 - CanAccessXCanAccessYCanAccessZ 等..

有人可以告诉我这些物品是否可以变成索赔或者它们属于其他地方吗?

作为次要问题,由于所有声明都序列化到 cookie 中,加载太多声明是否是个坏主意?检索额外声明 post 身份验证并仅将一小部分放在 cookie 上的行是什么。

谢谢。

如果符合应用程序的要求,将权限转化为声明通常是个好主意。基于声明的安全性的好处之一是用户的元数据(姓名、角色、年龄、许可等)与应用程序安全需求之间的分离。例如,如果某些 "action" 要求用户达到特定年龄,则只需简单检查 HasClaim(c => c.Type == Age && c.Value >= 18)。如果它需要一个简单的许可,为什么不检查 HasClaim(CanAccessX)?

许多应用程序(误)使用 "CanAccessX" / "CanReadY" / "CanWriteZ" 等组/角色来实现更简单(=更好)的安全机制。有了声明,这个概念就变得自然了。

其次,cookie 膨胀可能是一个问题。例如,如果用户拥有过多的组/角色/权限等,Kerberos 的令牌膨胀可能会成为一个问题。解决这个问题的一种方法是在基于声明的安全性之前使用某种基于角色的安全性:如果 n 角色具有 m 权限(n应该比m小很多),你只能把n角色写入cookie,但是在一个简单的模块/中间件中在幕后转换它们。另一种解决方案可能是自定义身份/权限映射,因此您只需将用户身份写入 cookie,但在实际处理请求之前将其与其(缓存的)权限相匹配。

我将从直接方法开始(只需将所有声明写入 cookie)。然后,如果它变得太大并影响应用程序的性能,您可以使用或多或少复杂的模块/中间件来优化它的行为,这不应该影响实际的 "code".

请注意,已经有 .NET 机制来安全地处理 cookie 内容:对于经典(当前)IIS 应用程序,您可以使用 Session Authentication Module, for modern (future) OWIN applications you can use a Cookie Authentication Middleware.