asp.net-core - .AddOAuth() 与 .AddOpenIdConnect()

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

人们,

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

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

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

    auth0.com 的实验表明该代码带有 .AddOAuth()由于 HttpContext.GetTokenAsync("access_token") 能够获得访问 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;
                        }
                    };
                })
    

    这真的很奇怪,因为我可以通过代码流和范围在 postman 中获得两个 token (访问和 ID)openid email profile .

    auth0.com 上的教程还表明,具有附加范围的 .AddOpenIdConnect() 也可以获得访问 token 。
    非常混淆。

    那么,哪一种适用于什么情况?

    最佳答案

    OAuth 2.0框架描述了授予授权的总体模式,但没有定义如何实际执行身份验证。
    OpenID ConnectOIDC是一个 OAuth 扩展,它添加并严格定义了用于返回用户信息的 ID token - 是 OAuth 2.0 的配置文件,它定义了身份验证的工作流程。

    So if my mvc application needs to know who user is I need to use .AddOAuth()



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

    但是你仍然可以使用AddOAuth ,区别在于 OAuth 需要您从 IDP 获取访问 token 才能访问身份提供者的用户管理端点,该端点返回用户的个人资料信息。

    And if I need to call resource service from mvc application on behalf of current user I need to add AddOpenIdConnect() to get access_token?



    OIDC 是一种 OAuth 扩展,因此您可以使用任一扩展来获取访问 token 以访问 protected 资源。

    It is really strange, as I can get both tokens (access and id) in postman with code flow and scope openid email profile. Also tutorials on auth0.com show that .AddOpenIdConnect() with additional scope can get access token as well. Very confusing.


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

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

    关于asp.net-core - .AddOAuth() 与 .AddOpenIdConnect(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59958467/

    相关文章:

    angular - Angular SPA 中的 OpenID Connect 与 Asp.Net Core 3.1 后端

    spring - 使用 OAuth2 资源所有者密码授权类型在 Spring Cloud Gateway 中创建路由

    security - 大多数开放平台上的app-id和app-key有什么区别?

    asp.net - 无效操作异常 : No authentication handler is registered for the scheme Bearer.

    signalr - 如何在 ASP.NET Core 中获取 SignalR Hub 上下文?

    c# - OAuth token 授权(请求已被拒绝)

    适用于多个 WebApi 端点的 Azure AD 承载 token ?

    spring-boot - 如何在 Spring Boot 中将 keycloak 与不同的上下文根和反向代理集成

    cassandra - 使用 Cassandra 数据库的 ASP.NET Core 身份实现

    asp.net - 将 .aspx 网站转换为 ASP.NET Core