.AddOAuth() 与 .AddOpenIdConnect()
.AddOAuth() vs .AddOpenIdConnect()
人,
你能帮我解释一下这两种方法的区别和目的吗:
- 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")
的结果获得访问令牌,但如果 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;
}
};
})
这真的很奇怪,因为我可以在具有代码流和范围的邮递员中获得两个令牌(访问和 ID)openid email profile
。
auth0.com 上的教程还表明具有附加作用域的 .AddOpenIdConnect() 也可以获得访问令牌。
很混乱。
那么,哪一个用于什么情况?
OAuth 2.0
框架描述了授予授权的总体模式,但没有定义如何实际执行身份验证。
OpenID Connect
或 OIDC
是一个 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 会给你一个 access token 加上一个 id token。 id 令牌是一个 JWT,包含有关经过身份验证的用户的信息。您的客户端应用程序将在 AddOpenIdConnect
扩展程序的帮助下验证令牌、解码令牌以获取用户的个人资料信息。
但您仍然可以使用 AddOAuth
,区别在于 OAuth 需要您从 IDP 获取访问令牌以访问身份提供者的用户管理端点,即 returns 用户的个人资料信息。
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 扩展,因此您可以使用其中任何一个来获取访问令牌以访问受保护的资源。
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 的范围,还包括不记名访问令牌。这是为了确保令牌响应符合 OAuth 2.0 规范。对于仅请求 ID 令牌的基本 OpenID 身份验证请求,此访问令牌是名义上的,可以安全地忽略。但是,当还请求访问 UserInfo 端点上的用户配置文件数据时,访问令牌会发挥作用。
但是当你想要获取access token来访问protected时resource/API,你需要在IDP(Auth0)上注册资源并添加OIDC Scope,这样Auth0才能征求用户的同意来获取access token。
人,
你能帮我解释一下这两种方法的区别和目的吗:
- 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")
的结果获得访问令牌,但如果 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;
}
};
})
这真的很奇怪,因为我可以在具有代码流和范围的邮递员中获得两个令牌(访问和 ID)openid email profile
。
auth0.com 上的教程还表明具有附加作用域的 .AddOpenIdConnect() 也可以获得访问令牌。 很混乱。
那么,哪一个用于什么情况?
OAuth 2.0
框架描述了授予授权的总体模式,但没有定义如何实际执行身份验证。
OpenID Connect
或 OIDC
是一个 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 会给你一个 access token 加上一个 id token。 id 令牌是一个 JWT,包含有关经过身份验证的用户的信息。您的客户端应用程序将在 AddOpenIdConnect
扩展程序的帮助下验证令牌、解码令牌以获取用户的个人资料信息。
但您仍然可以使用 AddOAuth
,区别在于 OAuth 需要您从 IDP 获取访问令牌以访问身份提供者的用户管理端点,即 returns 用户的个人资料信息。
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 扩展,因此您可以使用其中任何一个来获取访问令牌以访问受保护的资源。
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 的范围,还包括不记名访问令牌。这是为了确保令牌响应符合 OAuth 2.0 规范。对于仅请求 ID 令牌的基本 OpenID 身份验证请求,此访问令牌是名义上的,可以安全地忽略。但是,当还请求访问 UserInfo 端点上的用户配置文件数据时,访问令牌会发挥作用。
但是当你想要获取access token来访问protected时resource/API,你需要在IDP(Auth0)上注册资源并添加OIDC Scope,这样Auth0才能征求用户的同意来获取access token。