原文:https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler/
发布于:2017年11月
环境:ASP.NET Core 2.0

通过OIDC provider 把Claims映射到ClaimsPrincipal这一步骤,在ASP.NET Core 2中新的OpenID Connect handler具有不同的行为。
这是特别令人困惑和难以诊断的,因为这里有几个部件聚集在一起。我们来看一下。
您可以使用我的示例OIDC客户端来观察到相同的结果。

将标准claim类型映射到Microsoft专有claim类型

一件令人烦恼的事情是微软仍然认为他们知道什么是最适合你的,将OIDC标准声明映射到其专有声明。
可以通过清除Microsoft JWT令牌处理程序上的入站声明类型映射来优雅地修复:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

基本的OpenId Connect授权请求

接下来,让我们从客户端请求openid scope的场景开始。
首先令人困惑的是Microsoft使用openid和profile scope预先在OpenIdConnectOptions上填充了Scope集合。这意味着如果你只想请求openid,你首先需要清除Scope集合,然后手动添加openid。

services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.AccessDeniedPath = "/account/denied";
})
.AddOpenIdConnect("oidc", options =>
{
options.Authority = "https://demo.identityserver.io";
options.ClientId = "server.hybrid";
options.ClientSecret = "secret";
options.ResponseType = "code id_token"; options.SaveTokens = true; options.Scope.Clear();
options.Scope.Add("openid"); options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
});

使用ASP.NET Core v1处理程序,将返回以下声明:nbf,exp,iss,aud,nonce,iat,c_hash,sid,sub,auth_time,idp,amr。

在V2中我们只能得到sid,sub和idp。发生了什么?

微软在其OpenID Connect handler中添加了一个名为ClaimActions的新概念。Claim actions用来实现自外部provider的claim如何映射(或不)到您的ClaimsPrincipal中的claim。查看OpenIdConnectOptions的构造函数,您可以看到,处理程序现在默认会跳过以下声明:

ClaimActions.DeleteClaim("nonce");
ClaimActions.DeleteClaim("aud");
ClaimActions.DeleteClaim("azp");
ClaimActions.DeleteClaim("acr");
ClaimActions.DeleteClaim("amr");
ClaimActions.DeleteClaim("iss");
ClaimActions.DeleteClaim("iat");
ClaimActions.DeleteClaim("nbf");
ClaimActions.DeleteClaim("exp");
ClaimActions.DeleteClaim("at_hash");
ClaimActions.DeleteClaim("c_hash");
ClaimActions.DeleteClaim("auth_time");
ClaimActions.DeleteClaim("ipaddr");
ClaimActions.DeleteClaim("platf");
ClaimActions.DeleteClaim("ver");

如果您想“取消”跳过某项声明,则需要在设置handler时删除特定声明。以下是获取amr声明的非常直观的语法:

options.ClaimActions.Remove("amr");

从OIDC provider请求更多的Claim

当你要求更多的范围时,例如个人资料或自定义范围导致更多索赔,还有另一个令人困惑的细节需要注意。
根据OIDC协议中的response_type,某些声明通过id_token进行传输,有些通过userinfo端点进行传输。我在这里写了关于此细节的文章
因此,首先您需要在处理程序中启用对userinfo端点的支持:

options.GetClaimsFromUserInfoEndpoint = true;

如果声明由userinfo返回,ClaimsActions将用于从返回的JSON文档映射claim到principal。这里使用以下默认设置:

ClaimActions.MapUniqueJsonKey("sub", "sub");
ClaimActions.MapUniqueJsonKey("name", "name");
ClaimActions.MapUniqueJsonKey("given_name", "given_name");
ClaimActions.MapUniqueJsonKey("family_name", "family_name");
ClaimActions.MapUniqueJsonKey("profile", "profile");
ClaimActions.MapUniqueJsonKey("email", "email");

如果您向您的客户发送的不属于上述列表的claim,它会被忽略,您需要进行明确的映射。例如您希望客户端通过userinfo(标准OIDC声明之一,但不幸未由Microsoft映射)获得website claim - 您需要自行添加映射:

options.ClaimActions.MapUniqueJsonKey("website", "website");

这同样适用于您通过userinfo返回的任何其他声明。

我希望这有帮助。简而言之 – 你应该明确的知道你的映射,因为我相信这些默认映射将在可能会发生变化,这将导致您的客户端应用程序出现意外行为。

Asp.net Core 2.0 OpenId Connect Handler缺失Claims?的更多相关文章

  1. [翻译]在asp.net core2.0 OpenID Connect Handler中丢失了声明(CLaims)?

    注:这是一篇翻译,来自这里.这篇文章讲述了在asp.net core2.0中使用openid connect handler的过程中解析不到你想要的claim时,你可以参考这篇文章. Missing ...

  2. [转]Writing Custom Middleware in ASP.NET Core 1.0

    本文转自:https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ One of the new ...

  3. [译]Writing Custom Middleware in ASP.NET Core 1.0

    原文: https://www.exceptionnotfound.net/writing-custom-middleware-in-asp-net-core-1-0/ Middleware是ASP. ...

  4. 用ASP.NET Core 1.0中实现邮件发送功能

    准备将一些项目迁移到 asp.net core 先从封装类库入手,在遇到邮件发送类时发现在 asp.net core 1.0中并示提供SMTP相关类库,于是网上一搜发现了MailKit 好东西一定要试 ...

  5. ASP.NET Core 2.0 SignalR 示例

    # 一.前言 上次讲SignalR还是在<[在ASP.NET Core下使用SignalR技术](http://dotnet.ren/2017/02/21/%E5%9C%A8ASP-NET-Co ...

  6. 在ASP.NET CORE 2.0使用SignalR技术

    一.前言 上次讲SignalR还是在<在ASP.NET Core下使用SignalR技术>文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划 ...

  7. Razor Page–Asp.Net Core 2.0新功能

    Razor Page介绍 前言 上周期待已久的Asp.Net Core 2.0提前发布了,一下子Net圈热闹了起来,2.0带来了很多新的特性和新的功能,其中Razor Page引起我的关注,作为web ...

  8. asp.net core 2.0 web api基于JWT自定义策略授权

    JWT(json web token)是一种基于json的身份验证机制,流程如下: 通过登录,来获取Token,再在之后每次请求的Header中追加Authorization为Token的凭据,服务端 ...

  9. 从头编写 asp.net core 2.0 web api 基础框架 (1)

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

随机推荐

  1. Vehicle routing with Optaplanner graph-theory

    Vehicle routing with Optaplanner - Stack Overflow https://stackoverflow.com/questions/22285252/vehic ...

  2. java-mybaits-016-mybatis知识点StatementType

    1.statementType 在mapper文件中可以使用statementType标记使用什么的对象操作SQL语句. statementType:标记操作SQL的对象 要实现动态传入表名.列名,需 ...

  3. 算法习题---5.5集合栈计算机(Uva12096)*****

    一:题目 对于一个以集合为元素的栈,初始时栈为空. 输入的命令有如下几种: PUSH:将空集{}压栈 DUP:将栈顶元素复制一份压入栈中 UNION:先进行两次弹栈,将获得的集合A和B取并集,将结果压 ...

  4. Linux记录-批量安装LNMP(转载)

    #!/bin/bash # Describe: This is a one - button installation service script # 提示:使用此脚本时,尽量先选择第一项配置Yum ...

  5. centos上为新创建的用户(git)指定根目录并生成公钥和私钥

    1.修改用户的根目录 vim /etc/passed 2.su git 3.ssh-keygen -t rsa ssh-keygen -t rsa 4.如图所示,如果要实现无密码访问git仓库,把公钥 ...

  6. AI佳作解读系列(五) - 目标检测二十年技术综述

    计算机视觉中的目标检测,因其在真实世界的大量应用需求,比如自动驾驶.视频监控.机器人视觉等,而被研究学者广泛关注.   上周四,arXiv新出一篇目标检测文献<Object Detection ...

  7. Python - 在CentOS7.5系统中安装Python3

    注意:以下内容均使用root用户执行操作. 1-确认信息 # uname -a Linux localhost.localdomain 3.10.0-957.el7.x86_64 #1 SMP Thu ...

  8. RF之条件判断、初始化清除-4

    条件判断:        rf中用run keyword if 关键字做条件判断,以此来达到类似在python中if ...else...条件判断的功能. 注意:ELSE IF一定都是大写的,不然运行 ...

  9. 了解 Selenium 定位方式

    ※元素定位的重要性:在于查找元素 And 执行元素 定位元素的三种方法 1.定位单个元素:在定位单个元素时,selenium-webdriver 提示了如下一些方法对元素进行定位.在这些定位方式中,优 ...

  10. 【计算机视觉】基于Shading Model(对光照变化一定不变性)的运动目标检测算法

    光照模型(Shading Model)在很多论文中得到了广泛的应用,如robust and illumination invariant change detection based on linea ...