使用OIDC的JWT

时间:2019-01-24 12:25:00

标签: authentication oauth identity oidc

我需要保护WebApi并使用oAuth。有很多方法,但我找不到适合自己需求的方法。

我正在尝试使用oAuth保护我的服务,但不确定如何。这只是一个有关我进入认证/授权领域的经验的故事。

我正在尝试开发一种服务,希望用户在其中识别自己的身份。我可能想创建一个用户存储库,但目前我只允许来自Google,Microsoft,Twitter等第三方提供商的登录即可。

我正在使用微服务体系结构(AspNet Core(2.2))编写一个后端,其中网关API将请求路由到所需的微服务。到目前为止一切正常,一切正常!

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

现在我的问题是,我希望用户标识自己。我尝试在身份验证和授权领域进行挖掘,但对术语,应该做和不应该做以及大量的复杂性感到不知所措。另外,有很多网站都在部分地解决该问题,但是无法解释一个完整的系统应该如何组合在一起。

首先,我尝试使用IdentityServer4软件包运行自己的身份服务器,这确实非常好,但是再次带来了复杂性。我让前端获取JWT令牌,但是后端无法对其进行验证。另外,我可以想象将IdentityServer实例部署到生产环境中需要很多我没有的深入研究。

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

我还了解OpenID Connect(OIDC)是oAuth的超集,增加了授权功能。再次,我认为有很多可用的信息,但是没有什么真正适合我的需求。

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

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

您推荐什么系统或服务?我认为IdentityServer4确实符合我的需求。如果是这样,我只需要深入研究即可。学习曲线很大,但是可以。但是,我不喜欢在不适合我的系统上花费大量时间。

再说一次,您建议什么解决方案,最好是免费的;)

1 个答案:

答案 0 :(得分:0)

您可以使用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库,其中包含有用的方法和事件