微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

通过id_token或access_token 1id_token_hint 2使用AddJwtBearerClientAuthentication

如何解决通过id_token或access_token 1id_token_hint 2使用AddJwtBearerClientAuthentication

上下文

我正在构建本机/网络混合应用程序。它的一部分将由API驱动,一部分将是显示现有网站的网络视图。 使用OIDC SDK(Amplify / AppAuth)登录后,我就可以访问用户id_tokenaccess_token

但是,由于SDK中使用的Web视图不可控,因此我无法重用身份服务器生成的Cookie。

问题

由于上述原因,我正在尝试从他们的id_token或他们的access_token登录用户。 (都是JWT)

我相信IdentityServer4不支持功能,但我希望自己实现一些功能

到目前为止我发现的东西:

1)id_token_hint

OpenID Connect Core 1.0,Section 3.1.2.1id_token_hint参数:

可选。先前由授权服务器发行的ID令牌,作为有关最终用户当前或过去与客户端的已认证会话的提示而传递。如果由ID令牌标识的最终用户登录或由请求登录,则授权服务器将返回肯定响应;否则,服务器将返回肯定响应。否则,它应该返回错误,例如login_required。如果可能,在使用id_token_hint时应该出现prompt=none,如果没有,则可能会返回invalid_request错误;但是,服务器应该尽可能地成功响应,即使它不存在也是如此。当授权服务器用作id_token_hint值时,不必将其列为ID令牌的受众。 如果RP从OP接收到的ID令牌已加密,则要将其用作id_token_hint,客户端必须解密包含在加密ID令牌中的已签名ID令牌。客户端可以使用一个密钥将签名的ID令牌重新加密到身份验证服务器,该密钥使服务器能够解密ID令牌,并将重新加密的ID令牌用作id_token_hint值。

根据OpenID的此可选规范,我应该能够使用/authorize端点上的id_token登录用户。我知道IdentityServer4中未实现此功能,但我正在寻找AddCustomAuthorizeRequestValidator来实现。但是我不确定如何在代码中“从id_token中获取用户”。你有指针吗?

2)使用AddJwtBearerClientAuthentication

这个方法听起来像我可以从我的access_token进行身份验证,但是我找不到太多有关如何使用它的文档。

解决方法

问题

如果我对要求有误解,请告诉我,但感觉您有2个不同的应用程序,并试图使它们看起来像是一组集成的屏幕。

由于Web视图是私有浏览器会话,并且不能使用系统浏览器cookie,因此默认行为如下。您想阻止第二步,因为这是糟糕的用户体验:

  • 用户登录到移动应用
  • 无论何时调用安全的Web视图,都会有一个新的不带身份验证Cookie的专用浏览器会话,因此需要重新登录

常用方法:向Web视图提供令牌

如果两个应用程序属于同一用户体验,通常会将移动令牌转发到Web视图。如果需要,可以扩展移动应用程序的范围,使其包含网络应用程序的范围。

您不需要发行任何新令牌或更改任何一个应用程序的安全模型。但是移动和Web应用程序需要在解决方案上协同工作。

服务器端Web应用程序的可能的Web视图解决方案

这可能是最简单的选项:

  • 提供需要令牌而不是cookie的新的.Net Core Web后端入口点URL
  • 然后,移动应用可以从网络视图中调用这些端点,并在网络视图请求的授权标头中提供其自己的令牌
  • 然后,Web后端可以将移动Web视图请求转发到您的Web API

将授权标头添加到Web视图请求中的代码可能有点棘手,但是有一些方法可以做到:

SPA的可能的Web视图解决方案

适用于Cookielessless SPA的一个选项是Web视图通过Javascript桥向移动主机应用程序请求访问令牌。我的一些代码针对无cookie的SPA做到了这一点:

您可以从本地PC克隆/运行移动github存储库以查看解决方案。我将在博客的Mobile Web Integration Post中对此进行一些记录。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。