【发布时间】:2016-01-07 02:44:39
【问题描述】:
我很惊讶 .NET 中的 IIdentity 接口对主机安全环境做出了某些设计假设,第一是系统使用名称。
我认为这对大多数应用程序来说是有意义的,尤其是传统的计算机安全,其中每个用户都有一个用户名作为其主要标识符,当然在 NT 上 SId(NT 安全标识符)是真实 ID。
此设计假设用户名是不可变的:当用户的用户名同时更改时会发生什么? IIdentity.Name 属性是只读的,因此在代码中是不可变的。
但主要是,该设计还假设完全使用用户名。如果系统避免使用基于字符串的名称并使用基于整数的显式用户 ID,或者像 GUID 这样更奇特的东西,那又会如何呢?将其实现为String Name { get { return this.UserId.ToStringInvariant(); } } 感觉不对。
更深入地讲,如果当前安全上下文不仅取决于用户的身份验证详细信息,还取决于他当前的客户端软件、网络位置和其他方面,您如何处理“复合身份”?当然,这些可以被认为只是更多的声明示例(我很感激 ClaimsIdentity 现在是 .NET 4.5 中的基本实现),但是如果你有一个复杂的声明,那么声明都是基于 .NET 4.5 中的 string对象图作为声明的一部分,您需要将其转换为某种字符串表示形式(或Claim.Properties 中的二维字符串表示形式)并希望有效。
在老式的 .NET 1.0-3.5 中,我只需通过返回 Name 的用户名来实现 IIdentity(幸运的是,我从事的每个项目都至少有一些类似的用户名,有时非常脆弱),然后在我的实现中添加额外的“声明”作为强类型属性,包括复杂的对象图属性值。
...那一定是正确的吗? .NET 中是否有任何基础架构代码对IIdentity 的性质做出假设?
【问题讨论】:
标签: .net identity claims-based-identity