【问题标题】:Using Google OAuth to secure web services in aspnet core使用 Google OAuth 保护 aspnet 核心中的网络服务
【发布时间】:2017-12-19 19:35:17
【问题描述】:

我迷失在 OAuth 和 OpenIDConnect 以及 aspnet 核心中间件中。对此的任何帮助将不胜感激。

我有多个使用同一组 Web 服务的 UI(Web、本机应用程序),我想确保只有经过身份验证的用户才能访问 Web 服务。我的组织使用 Google 帐户,因此我想使用仅限于组织域的 Google 身份验证。

在this sample 之后,该网站正确地要求身份验证。我现在需要的是让网站 (AngularJS 4) 使用我可以通过 Google 验证的身份验证令牌调用我的后端 Web 服务。

后端服务是用 aspnet core 编写的。我尝试过使用这些方法:Google middleware 和 Google OpenIDConnect 但这些方法仍然 1) 假设有一个 UI 可以提示未经授权的用户登录,并且 2) 似乎是基于 cookie 的,我不会有用于 Web 服务调用的 cookie。

我不想提示用户登录,因为本例中的“用户”是软件客户端。他们要么已经过身份验证,要么还没有。我只需要获取身份验证令牌,对其进行验证,然后继续。

This appears to be the same question,也没有人回答。

感谢任何建议。此外,还有关于让原生应用也能做到这一点的建议或提示!

【问题讨论】:

    标签: authentication asp.net-core google-oauth google-openid asp.net-core-identity


    【解决方案1】:

    搞定了。如前所述,我迷路了,OpenIDConnect 虽然在多个领域被引用为解决方案,但对于 Web 服务来说却是一条红鲱鱼。以下是我现在的工作,我可以提供尽可能完整的步骤(需要进行一些清理):

    1. 将身份验证添加到 UI following these directions
    2. 获取JWT令牌as shown in the first segment here
    3. 在每个 Web 服务调用中,在标头中包含 JWT 令牌:

      名称:身份验证

      值:不记名{token value}

    4. 安装JwtBearer NuGet package

    5. 在 Web 服务的 Startup 的 ConfigureServices 方法中,在 AddMvc() 之后:

          services.AddAuthorization(options =>
      {   // this policy needed only if you want to restrict to accounts within your domain. otherwise, don't use options. or use whatever options work for you.
              options.AddPolicy("hd",
                  policy => policy.RequireAssertion(context =>
                      context.User.HasClaim(c =>
                          c.Type == "hd" &&
                          ("https://accounts.google.com".Equals(c.Issuer) ||
                           "accounts.google.com".Equals(c.Issuer, StringComparison.CurrentCultureIgnoreCase)) &&
                          c.Value == "yourdomain.com"
                      )));
      });
      
    6. 在 Configure 方法中,在 UseMvc() 之前:

              JwtBearerOptions jwtOptions = new JwtBearerOptions();
              jwtOptions.Audience = "{the OAuth 2.0 client ID credential from google api developer console}";
              jwtOptions.Authority = "https://accounts.google.com";
              jwtOptions.TokenValidationParameters = new TokenValidationParameters();
              jwtOptions.TokenValidationParameters.ValidIssuers = new List<string>()
              {
                  "https://accounts.google.com",
                  "accounts.google.com"
              };
      
              app.UseJwtBearerAuthentication(jwtOptions);
      

    也许有更合适的方法来做到这一点......如果有,我有兴趣尝试一下。目前,这是可行的。

    【讨论】:

      【解决方案2】:

      我会尽力帮忙的。

      首先,您需要查看 OpenID Connect(基于 OAuth 2.0 构建),记住 OAuth 2.0 NOT an Authentication protocol。

      1) 假设有一个 UI 假设您使用的是 Google 服务,则无需 UI 即可登录。您只需要检查是否存在并验证访问令牌、身份令牌(也许还有刷新令牌)。如果没有 Token,则假设用户未通过身份验证,并使用授权请求将其重定向到身份验证服务器。

      如果存在有效的访问令牌和刷新令牌,则可以假定用户已通过身份验证。

      您还可以检查访问令牌是否有适当的“范围”,以确定它们是否已针对您的特定应用程序授权。

      如果您使用 Google 作为授权服务器,您可以在 Identity Token 中 validate the the hd parameter 拥有所需的域。

      顺便说一句:不涉及 cookie。

      希望对您有所帮助。

      【讨论】:

      • 谢谢,我确实了解这些概念和流程(我认为)。我遇到的问题是到目前为止我发现的所有中间件都假设您将使用 UI 登录。我还没有找到任何示例或文档来说明如何让 已经登录的客户端 通过 Web 服务调用在服务器端发送正确的令牌进行验证。我想在控制器上使用 [Authorize] 属性,并让正确的中间件通过 Google 验证适当的令牌。我是否必须编写自己的中间件才能做到这一点,还是已经存在一个?
      • 我想我不明白。 OAuth 和 OIDC 有 4 个参与者。资源所有者(用户)和 OAuth 客户端(应用程序)、OIDC 提供者(在您的示例中为 Google)和资源服务器(保存受保护资源)。当您说“已经登录的客户”时,您指的是哪个?通常,OAuth 客户端应该对返回的令牌进行验证,以确保它们没有被篡改,并且确实是从适当的 OIDC 提供者那里返回的,而不是中间人。应该使用许多库。
      • 感谢您对我的耐心。让我看看能否澄清一下:我有 2 个 OAuth 客户端:Web UI 和 Web 服务。这些不是作为同一进程的一部分运行的;它们在不同的服务器上运行。 Web UI 可以使用 Google javascript 库完成整个 OAuth 过程。完成后,用户应该能够使用 Web UI,进而调用各种 Web 服务。因此,UI 已经获得了应该包含在 Web 服务调用中的某种令牌,并且 Web 服务应该验证该令牌。
      猜你喜欢
      • 2017-02-10
      • 1970-01-01
      • 2017-11-26
      • 2017-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2016-03-15
      相关资源
      最近更新 更多