使用oidc的JWT使用不同数量的客户端进行身份验证

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用oidc的JWT使用不同数量的客户端进行身份验证相关的知识,希望对你有一定的参考价值。

我需要保护Web Api并使用oAuth。有很多方法,但我真的找不到符合我需求的方法。

我正试图用oAuth保护我的服务,但我不确定如何。这只是一个关于我深入了解身份验证/授权领域的经历的故事。

我正在尝试开发一种服务,我希望用户能够识别自己。我可能想要创建一个用户存储库但是现在我很好,只允许来自第三方提供商的登录,如谷歌,微软,Twitter等。

我正在使用微服务架构(AspNet Core(2.2))编写后端,并使用网关API将请求路由到所需的微服务。到目前为止一切都那么好,一切都运行良好!

我的服务是使用与网关API通信的前端框架(Angular)呈现的。再次,这里一切都很好。

现在我的问题是,我希望用户识别自己。我尝试在认证和授权的世界中挖掘,并被术语,做什么和不做以及大量的复杂性所淹没。此外,有很多网站部分解决了这个问题,但没有解释一个完整的系统应该如何组合在一起。

首先,我尝试使用IdentityServer4软件包运行我自己的身份服务器,顺便说一句,这是非常好的,但同样复杂性。我得到了前端来获取JWT令牌,但后端无法验证它。此外,我可以将身份服务器实例部署到生产环境的映像需要大量深入的工作,这是我没有的。

我试过auth0.com,但我没有让整个系统工作。同样,我能够使用前端网站登录,但配置后端并使其验证传入请求更加困难。

我也明白OpenID Connect(OIDC)是oAuth的超级集合,增加了授权功能。我再次认为有很多可用的信息,但没有任何东西真正符合我的需求。

简而言之,我的问题是我有很多(ASP.NET Core WebApi)服务和(一个或多个)前端系统,我想部分使用身份验证和授权进行保护。

我希望前端获取一个JWT令牌,它应该使用Authentication头传递给网关。现在我希望网关将这些请求路由到所需的微服务,该服务使用身份服务验证令牌,并根据用户的许可接受或拒绝请求。

您推荐哪些系统或服务?我觉得IdentityServer4真的符合我的需求。如果是这样的话,我只需要深入研究。学习曲线很大,但还可以。但是,我不喜欢花费大量时间在一个对我不起作用的系统上。

再说一遍,你推荐什么解决方案,最好免费;)

答案

您可以使用identity server 4它完美地工作,您必须在您的身份服务器中定义您的客户端列表,它必须与您的角度应用程序中的客户端列表相同,例如:appsettings.json

...
"Clients": {
"Confidential": {},
"Public": {

  "angularapp1": {
    "ClientId": "spa-app1",
    "ClientName": "client application1",
    "ClientUri": "http://localhost:4200", // for development case
    "RequireConsent": false,
    "AllowedGrantTypes": [ "implicit" ], // the authorization flow to use
    "AllowAccessTokensViaBrowser": true,
    "RedirectUris": [
      "http://localhost:4200/#/auth-callback#", // post login redirect
      "http://localhost:4200/assets/html/silent-refresh-redirect.html" // silent refresh 
    ],
    "PostLogoutRedirectUris": [ "http://localhost:4200?postLogout=true" ],
    "FrontChannelLogoutUri": "http://localhost:4200?frontchannellogout=true",
    "FrontChannelLogoutSessionRequired": true,
    "AllowedCorsOrigins": [ "http://localhost:4200" ],
    "AllowedScopes": [ "openid", "profile", "email" ], //alowed scopes
    "IdentityTokenLifetime": 18000,
    "AccessTokenLifetime": 18000
  },
 "angularapp2": {...}


...
}

对于前端方面,最好的选择是使用隐式流,这样你就可以在有效期内为角客户端提供访问权限,这比使用授权代码流更好,因为你必须将秘密密钥存储在你的角度应用程序和秘密中用于生成访问令牌,它不安全

enter image description here

我使用oidc-client.js它是一个非常有用的javascript库,包含有用的方法和事件

以上是关于使用oidc的JWT使用不同数量的客户端进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章

JWT

是否有基于 OIDC 的基于 IDaaS 的社交登录的标准模式?

基于OIDC实现istio来源身份验证

如何跨不同 API 对 JSON Web 令牌 (JWT) 进行身份验证?

使用 JWT 进行身份验证时如何区分用户类型

如何使用 openid connect OIDC 加密 REST 正文