ClaimTypes的ASP.NET要求

20

我正在研究在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 使用。因此,我可能会使用其中一些预定义的键:

List<Claim> claims = new List<Claim>
{
    new Claim(ClaimTypes.Sid, user.ID),
    new Claim(ClaimTypes.Name, user.Name),
    new Claim(ClaimTypes.Role, "basic")
};

问题:
  1. 如果我使用预定义的键名,那么每个键所分配的实际值是否有任何规则/限制,还是由应用程序定义?例如,在 ClaimTypes.Sid 中放入数据库主键是否可以,或者ASP.NET对 ClaimTypes.Sid 应包含什么有某些特定的期望?

  2. 是否存在任何要求使用的ClaimTypes,还是完全由应用程序决定包括或不包括哪些内容?我想答案可能取决于与之交互的具体第三方认证服务,但是在不使用任何第三方认证的自包含ASP.NET项目的简单情况下又如何呢?ASP.NET本身是否有任何要求?

任何关于使用特定键名/值的要求和/或最佳实践的链接将不胜感激。
2个回答

14
如果我使用预定义的键,是否有关于分配给每个键的实际值的规则/限制,还是由应用程序定义?例如,在ClaimTypes.Sid中放置数据库主键是否可以,或者ASP.NET对ClaimTypes.Sid应包含什么有特定的期望?
使用预定义的ClaimTypes之一也会修改Type属性,如果您的结果Claim。您可以在此处找到这些类型的列表。据我所知,您可以自由地将数据库ID放入ClaimTypes.Sid中,但我强烈建议使用自己的名称来调用它。
是否有任何必需的ClaimTypes,还是完全由应用程序决定包括什么或不包括什么?我想答案可能取决于我要与之交互的特定第三方身份验证服务,但是对于不使用任何第三方身份验证的自包含ASP.NET项目的简单情况,ASP.NET本身是否有任何要求?
假设没有第三方,您可以决定什么是必需的和不必要的。请记住,如果您将声明存储在cookie中(而不是第三方来源),则空间有些受限;cookie的总大小不能超过4096字节
到目前为止,我发现关于ASP.NET Core声明身份验证最好的文章是这里这里。截至本帖发布时,我们仍处于RC1阶段,因此在最终版本发布之前可能会有一些细节变化。

7
如果使用预定义键,是否有关于分配给每个键的实际值的规则/限制,还是由应用程序定义?例如,在ClaimTypes.Sid中放置数据库主键是否可以,或者ASP.NET对ClaimTypes.Sid应该包含什么有某些期望?
基本上没有规则限制,但取决于令牌的使用者。默认情况下,Asp.Net Identity希望用户名为ClaimTypes.Name(无论您使用的是用户显示名称还是邮件),角色为ClaimTypes.Role,并将用户ID(不一定是行ID,只需唯一标识用户即可,例如Guid或电子邮件地址)作为ClaimTypes.NameIdentifier。默认值也可以在GitHub上看到。
话虽如此,如果使用自定义声明类型,则需要在配置Asp.Net Identity时在ClaimsIdentityOptions中告知它。

UserNameClaimType 中设置的声明类型是在控制器中使用 User.Identity.Name 访问它时使用的类型。如果您的声明类型与 ClaimsIdentityOptions 中的不匹配,它将只返回 null。


感谢有关Identity的信息。我目前没有使用Identity,但未来可能会改变。我现在正在使用EF6和MVC Core 1(因为EF7过于不完整),而Identity似乎与EF7交织在一起,并且需要跳过一些障碍才能与EF6配合使用,所以我暂时搁置它。 - cbranch

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