[翻译]在asp.net core2.0 OpenID Connect Handler中丢失了声明(CLaims)?
注:这是一篇翻译,来自这里。这篇文章讲述了在asp.net core2.0中使用openid connect handler的过程中解析不到你想要的claim时,你可以参考这篇文章。
Missing Claims in the ASP.NET Core 2 OpenID Connect Handler?
当从OIDC provider(identity provider,idp)中将claims映射到ASP.NET Core 2中的ClaimsPrincipal时,新的OpenID Connect Handler表现出了一些不同的行为。
这种情况看起来特别令人困惑和难以诊断,因为这里有几个变化的部分。让我们看看。
你也可以从这里下载demo来研究以下。
Mapping of standard claim types to Microsoft proprietary ones从标准claim类型映射成Microsoft专有的
首先让人感到恶心的是,Microsoft仍然认(意)为(淫)将OIDC标准的Claim类型映射成他们专有的类型(这种做法)对于你来说是最好的一种方式。
令人欣慰的是,通过在Microsoft JWT令牌处理程序(token handler)中清除流入(inbound )Claim类型映射,可以很好地解决这个问题:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
A basic OpenID Connect authentication request一个基本的OpenID Connect authentication handler请求
接下来,让我们从一个简单的场景开始,客户端只请求openid范围(scope)。
第一件令人困惑的事情是Microsoft会在OpenIdConnectOptions类的构造方法中预先加载openid和profile这两个请求范围。这意味着如果你只是想请求一个openid的范围,那么你必须调用一个清除的方法,然后在手动的把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");//②在添加,这样你才能只请求到openid这个scope options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
});
在asp.net core 1.x的版本中,上述代码会返回如下claim:nbf, exp, iss, aud, nonce, iat, c_hash, sid, sub, auth_time, idp, amr.
在asp.net core2.x的版本中,却只会返回sid, sub和idp。发生了神马??????
Microsoft在这其中添加了一个新的概念:ClaimActions。这个类具体要做的事情是指定一个规则,来处理外部流入的claims如何去映射成为你自己的ClaimsPrincipal中的claim。查看以下OpenIdConnectOptions的构造方法,你会发现现在这个openid connect handler在默认情况下跳过了很多的映射:
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");
如果你不想要错过某一个claim,那你需要通过claimaction来做一些设定。如下这个方法“很直观”的将一个“amr ”的claim找了回来:
options.ClaimActions.Remove("amr");//不想吐槽,不过这是什么狗屁名字了?希望不要产生误解,这个方法是要找回你想要的claim
如果你想要查看所有原始的这些claim(在ClaimsPrincipal中保存的token上),那你得将claimaction从里到外处理一遍(添加一堆的Remove方法)。
Requesting more claims from the OIDC provider从idp中获取更多的claim
当你想要请求更多的scope,比如profile,或者一些自定义的scope,总之就是想要多一些请求范围,那么你会发些另外一些令人困惑的事情。。。
依赖于OIDC这个协议中的response_type,一些claims是通过id token拿到的,而另一些则是通过userinfo端点拿到的。这些详细信息记录在这里。
所以,首先你需要在handler中添加对userinfo端点的支持:
options.GetClaimsFromUserInfoEndpoint = true;
如果claims从userinfo端点返回,那这个时候ClaimsAction又要上场了。它还是从返回的JSON document(userinfo返回的)中将claim映射到ClaimsPrincipal中。下面的代码展示了一些默认的设置:
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");
换句话说,如果一些发送到你客户端的claims中有一些特别的,没有存在于上面这些代码所展示的映射清单中出现,那么,那些(没有映射的)就直接被忽略了,没了,炒丢了。你得自己再显式的映射一遍:
options.ClaimActions.MapUniqueJsonKey("website", "website");//再换句话说,OIDC中出现的标准claim,但却并没有在Microsoft中进行映射,需要你自己映射。
同样的情形也适用于你通过userinfo返回的任何其他claim。
希望这些讲述是有帮助的。给我的感觉就是,OAuth2.0和OpenID Connect还在发展过程中,有一些东西将来可能是有变化的,现在对映射进行显式处理,如果Mocrofost在这里把一些东西写死了,将来万一有一些变化的东西出来,那就不好弄了。
[翻译]在asp.net core2.0 OpenID Connect Handler中丢失了声明(CLaims)?的更多相关文章
- Asp.net Core 2.0 OpenId Connect Handler缺失Claims?
原文:https://leastprivilege.com/2017/11/15/missing-claims-in-the-asp-net-core-2-openid-connect-handler ...
- 【翻译】asp.net core2.0中的token认证
原文地址:https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide token ...
- IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习保护API
IdentityServer4 ASP.NET Core的OpenID Connect OAuth 2.0框架学习之保护API. 使用IdentityServer4 来实现使用客户端凭据保护ASP.N ...
- 【翻译】asp.net core2.1认证和授权解密
asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...
- Asp.net Core2.0 缓存 MemoryCache 和 Redis
自从使用Asp.net Core2.0 以来,不停摸索,查阅资料,这方面的资料是真的少,因此,在前人的基础上,摸索出了Asp.net Core2.0 缓存 MemoryCache 和 Redis的用法 ...
- 一步一步带你做WebApi迁移ASP.NET Core2.0
随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...
- 【转】Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...
- Asp.Net Core2.0获取客户IP地址,及解决发布到Ubuntu服务器获取不到正确IP解决办法
1.获取客户端IP地址实现方法(扩展类) using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; u ...
- VS2017创建一个 ASP.NET Core2.0 应用,并搭建 MVC 框架
https://testerhome.com/topics/11747 1.使用最新版本的VS2017,并安装.NET Core2.0中相关开发工具 2.打开VS2017,点击文件-新建-项目,选 ...
随机推荐
- 详解 JSONP跨域请求的实现
跨域问题是由于浏览器为了防止CSRF攻击(Cross-site request forgery跨站请求伪造),避免恶意攻击而带来的风险而采取的同源策略限制.当一个页面中使用XMLHTTPR ...
- 51nod 1238 最小公倍数之和 V3
51nod 1238 最小公倍数之和 V3 求 \[ \sum_{i=1}^N\sum_{j=1}^N lcm(i,j) \] \(N\leq 10^{10}\) 先按照套路推一波反演的式子: \[ ...
- 设计模式のObserver Pattern(观察者模式)----行为模式
一.问题产生背景 又被称为订阅发布模式. 最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时, ...
- WPF自定义控件(一)の控件分类
一.什么是控件(Controls) 控件是指对数据和方法的封装.控件可以有自己的属性和方法,其中属性是控件数据的简单访问者,方法则是控件的一些简单而可见的功能.控件创建过程包括设计.开发.调试(就是所 ...
- poj2635
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/chaoweilanmao/article/details/33417423 这道题一看是大数题就知道 ...
- 转://Oracle打补丁方法论
成熟的IT企业,往往会有自己的补丁计划.如一年打几次补丁,打哪一个补丁. 在补丁之前,需要进行补丁分析,一份比较完善补丁分析,往往能帮助企业未雨绸缪,提前将可能引发的问题先解决掉,保证生产的稳定和安全 ...
- php设计模式-依赖注入模式(Dependency Injection)
依赖注入模式用来减少程序间的耦合.当一个类要使用另一个类时,一般的写法如下: <?php class Test1 { public function say() { echo 'hello'; ...
- 吴恩达课后作业学习1-week4-homework-multi-hidden-layer -2
参考:https://blog.csdn.net/u013733326/article/details/79767169 希望大家直接到上面的网址去查看代码,下面是本人的笔记 实现多层神经网络 1.准 ...
- day22 Pythonpython 本文xml模块
一.xml介绍 xml是实现不同语言或者程序直接进行数据交换的协议,跟json差不多,单json使用起来更简单.不过现在还有很多传统公司的接口主要是xml xml跟html都是标签语言 我们主要学习的 ...
- Node.js之mysql增删改查
1.安装库 npm install mysql 2.编写db.js(用作公共模块) //连接MySQL数据库 var mysql = require("mysql"); var p ...