我在ASP.NET(MVC Core 1.0)中使用基于声明的授权进行调查。设置ClaimsIdentity
时,我提供了一个键/值字符串对列表来表示每个Claim
。例如:
List<Claim> claims = new List<Claim>
{
new Claim("UserID", user.ID),
new Claim("Name", user.Name),
new Claim("Role", "basic")
};
我的理解是我可以使用我想要的任何键/值。但我注意到ClaimsType
class提供了一些预定义的密钥。因此,我可能会使用其中一些预定义的键:
List<Claim> claims = new List<Claim>
{
new Claim(ClaimTypes.Sid, user.ID),
new Claim(ClaimTypes.Name, user.Name),
new Claim(ClaimTypes.Role, "basic")
};
问题:
如果我使用预定义的密钥,是否有关于分配给每个密钥的实际值的规则/限制,还是应用程序定义的?例如,在ClaimTypes.Sid
中粘贴数据库主键是否可以,或者ASP.NET是否对ClaimTypes.Sid
应包含的内容有一定的期望?
是否有必需的ClaimTypes
,还是完全取决于应用程序来决定包含或不包含哪些内容?我想,答案可能取决于我将与之交互的特定第三方身份验证服务,但是如何使用不包含任何第三方身份验证的自包含ASP.NET项目的简单情况。 ASP.NET本身是否有任何要求?
有关使用特定键/值的要求和/或最佳实践的任何链接都将受到赞赏。
答案 0 :(得分:6)
如果我使用预定义的密钥,是否有任何规则/限制 关于分配给每个密钥的实际值,还是应用程序 界定?例如,是否可以粘贴数据库主键 ClaimTypes.Sid,或者ASP.NET对某些内容有一定的期望 ClaimTypes.Sid应该包含?
如果结果为ClaimTypes
,则使用其中一个预定义的Claim
也会修改Type属性。 You can find a list of these types here。据我所知,您可以自由地将数据库ID放入ClaimTypes.Sid
,但我强烈建议您使用自己的名称来调用它。
是否需要任何ClaimTypes,或者它是否完全符合 申请决定包括或不包括什么?我想 答案可能取决于特定的第三方身份验证服务 我会与之互动,但是如何简单的情况呢 不使用任何第三方的自包含ASP.NET项目 认证。 ASP.NET本身是否有任何要求?
假设没有第三方,您可以决定什么是必需的和不需要的。请记住,如果您将声明存储在Cookie(而非第三方来源)中,则您的空间有限; cookies cannot be larger than 4096 bytes in total
到目前为止,我发现的ASP.NET Core声明身份验证的最佳文章是here和here。截至本帖子,我们仍在RC1中,因此在最终版本发布之前,某些细节可能会发生变化。
答案 1 :(得分:1)
- 如果我使用预定义的密钥,是否有关于分配给每个密钥的实际值的规则/限制,还是应用程序定义的?例如,可以在ClaimTypes.Sid中粘贴数据库主键,还是ASP.NET对ClaimTypes.Sid应包含的内容有一定的期望?
醇>
基本上没有规则限制,但它取决于令牌的消费者。默认情况下,Asp.Net Identity要求用户名为file1.o file2.o file3.o:
(用户显示名称或邮件,无论您使用什么),角色为ClaimTypes.Name
和用户ID(不一定是行ID,只有将用户(即Guid或电子邮件地址)标识为ClaimTypes.Role
。默认值也可以显示为here on GitHub。
话虽如此,如果您使用自定义声明类型,则需要在配置Asp.Net Identity时在ClaimTypes.NameIdentifier
中告诉它。
ClaimsIdentityOptions
中设置的声明类型是您在控制器中UserNameClaimType
访问它时使用的声明类型。如果您的声明类型与User.Identity.Name
中的声明类型不匹配,则只会返回null。