【问题标题】:.AddOAuth() vs .AddOpenIdConnect().AddOAuth() 与 .AddOpenIdConnect()
【发布时间】:2020-05-14 10:36:30
【问题描述】:

人,

您能否为我澄清一下这两种方法的区别和目的:

  1. Microsoft.Extensions.DependencyInjection.OAuthExtensions.AddOAuth();
  2. Microsoft.Extensions.DependencyInjection.OpenIdConnectExtensions.AddOpenIdConnect()。

顾名思义,一个用于授权,另一个用于验证用户,对吧? 因此,如果我的 mvc 应用程序需要知道谁是用户,我需要使用.AddOpenIdConnect() 来获取id_token?如果我需要代表当前用户从 mvc 应用程序调用资源服务,我需要添加 .AddOAuth() 以获取 access_token

auth0.com 的实验表明,.AddOAuth() 的代码能够通过HttpContext.GetTokenAsync("access_token") 获得访问令牌,但如果HttpContext.GetTokenAsync("id_token") 则没有。

反之亦然 - .AddOpenIdConnect() 可以获得 id_token,但没有 access_token。

两者的配置相同:

.AddOAuth("oauth", o =>
            {
                o.AuthorizationEndpoint = "https://<Realm>.auth0.com/authorize?audience=resourceAPI-server";
                o.TokenEndpoint = "https://<REALM>.auth0.com/oauth/token";
                o.ClientId = "<clientID>";
                o.ClientSecret = "<secret>";
                o.CallbackPath = "/cb_oauth";
                o.SaveTokens = true;

            })
            .AddOpenIdConnect("openIdConnect", o =>
            {
                o.Authority = "https://<REALM>.auth0.com";
                o.ClientId = "<clientID>";
                o.ClientSecret = "<secret>";
                o.CallbackPath = "/cb_openIdConnect";
                o.SaveTokens = true;
                o.Events =new OpenIdConnectEvents()
                {
                    OnRedirectToIdentityProvider = rc =>
                    {
                        rc.ProtocolMessage.SetParameter("audience","resourceAPI-server");
                        return Task.CompletedTask;
                    }
                };
            })

这真的很奇怪,因为我可以在邮递员中使用代码流和范围openid email profile 获取两个令牌(访问和 ID)。

auth0.com 上的教程还显示,具有附加范围的 .AddOpenIdConnect() 也可以获得访问令牌。 非常混乱。

那么,哪一个适合什么情况?

【问题讨论】:

    标签: asp.net-core oauth-2.0 openid-connect


    【解决方案1】:

    OAuth 2.0 框架描述了授予授权的总体模式,但没有定义如何实际执行身份验证。

    OpenID ConnectOIDC 是 OAuth 扩展,它添加并严格定义了用于返回用户信息的 ID 令牌 - 是定义身份验证工作流的 OAuth 2.0 配置文件。

    所以如果我的 mvc 应用程序需要知道谁是用户,我需要使用 .AddOAuth()

    推荐的方式是使用 OIDC ,OpenID connect 会给你一个访问令牌和一个 id 令牌。 id 令牌是一个 JWT,包含有关经过身份验证的用户的信息。您的客户端应用程序将在 AddOpenIdConnect 扩展的帮助下验证令牌、解码令牌以获取用户的个人资料信息。

    但你仍然可以使用AddOAuth,不同的是OAuth需要你从IDP获取访问令牌来访问身份提供者的用户管理端点,它返回用户的个人资料信息。

    如果我需要代表当前用户从 mvc 应用程序调用资源服务,我需要添加 AddOpenIdConnect() 以获取 access_token?

    OIDC 是一个 OAuth 扩展,因此您可以使用任何一个来获取访问令牌以访问受保护的资源。

    这真的很奇怪,因为我可以通过代码流和范围 openid 电子邮件配置文件在邮递员中获取两个令牌(访问和 ID)。 auth0.com 上的教程还显示,具有附加范围的 .AddOpenIdConnect() 也可以获得访问令牌。非常混乱。

    openid email profile是 OIDC 范围。如果使用代码流,您没有提供您的范围,只有 OIDC 的范围,还包括一个不记名访问令牌。这是为了确保令牌响应符合 OAuth 2.0 规范。对于仅请求 ID 令牌的基本 OpenID 身份验证请求,此访问令牌是名义上的,可以安全地忽略。然而,当还在 UserInfo 端点请求访问用户配置文件数据时,访问令牌就会发挥作用。

    但是当你想要获取访问令牌来访问受保护的资源/API 时,你需要在 IDP(Auth0) 上注册资源并添加 OIDC Scope ,以便 Auth0 可以征求用户的同意来获取访问令牌。

    【讨论】:

    • 嗨南,感谢您的回答。当说“我的 mvc 应用程序需要知道我需要使用.AddOAuth() 的用户是谁”时,我可能不正确......应该是.AddOpenIdConnect。已更正。但仍不清楚。您说通过使用 .AddOpenIdConnect() 访问承载令牌作为额外信息给出?这是否意味着 .AddOpenIdConnect() 使用起来“更好”,因为它将同时提供令牌 id_token 和 access_token?那么,当用户需要经过身份验证和授权调用 api 的情况下,应该使用什么方法(方法)?
    • You say that by using .AddOpenIdConnect() access bearer token is given as extra information? 它提供包含用户信息的 ID 令牌。Does it mean that .AddOpenIdConnect() is "better" to use as it will give both tokens, id_token and access_token 如果您的应用程序希望在身份验证期间更轻松地获取用户信息并希望在令牌过期时刷新访问令牌,那么是的,使用 OIDC。另见:blog.runscope.com/posts/…
    • 好的。凉爽的。本文深入探讨了 Oauth/Oidc 的区别。 oauth.net/articles/authentication .AddOpenIdConnect() HttpContext.GetTokenAsync("access_token") 不返回令牌,只返回 id_token 让我感到困扰。然后为了获得 access_token .AddOauth() 应该使用..除非我以错误的方式使用它。
    • @VitaliyMarkitanov ,这通常是因为您使用了错误的流程,请尝试将ResponseType 设置为AddOpenIdConnectcode 以使用代码流程:andrewlock.net/…
    • 是的。 ResponseType = "code" 有帮助。我虽然默认值是代码.. 非常感谢
    猜你喜欢
    • 2021-04-23
    • 2020-08-27
    • 2018-08-23
    • 2020-06-18
    • 2021-03-29
    • 2018-10-13
    • 2021-04-05
    • 2020-07-06
    • 2021-10-03
    相关资源
    最近更新 更多