Asp.net core .AddOAuth()与.AddOpenIdConnect()的比较
人, 你能为我澄清一下这两种方法的区别和目的吗Asp.net core .AddOAuth()与.AddOpenIdConnect()的比较,asp.net-core,oauth-2.0,openid-connect,Asp.net Core,Oauth 2.0,Openid Connect,人, 你能为我澄清一下这两种方法的区别和目的吗 Microsoft.Extensions.DependencyInjection.OAuthExtensions.AddOAuth() Microsoft.Extensions.DependencyInjection.OpenIdConnectExtensions.AddOpenIdConnect() 根据名称,一个用于授权,另一个用于验证用户,对吗? 因此,如果我的mvc应用程序需要知道谁是用户,我需要使用.AddOpenIdConnect()获
.AddOpenIdConnect()
获取id\u令牌
?如果我需要代表当前用户从mvc应用程序调用资源服务,我需要添加.AddOAuth()
以获取访问\u令牌
使用auth0.com进行的实验表明,使用.AddOAuth()
的代码能够获得访问令牌,这是HttpContext.GetTokenAsync(“访问令牌”)
的结果,但如果HttpContext.GetTokenAsync(“id\U令牌”)
则没有
visa versa-.AddOpenIdConnect()
可以获取id\u令牌,但不能访问\u令牌
两者的配置相同:
.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;
}
};
})
添加oauth(“oauth”,o=>
{
o、 授权端点=”https://.auth0.com/authorize?audience=resourceAPI-服务器”;
o、 标记端点=”https://.auth0.com/oauth/token";
o、 ClientId=“”;
o、 ClientSecret=“”;
o、 CallbackPath=“/cb_oauth”;
o、 SaveTokens=true;
})
.AddOpenIdConnect(“openIdConnect”,o=>
{
o、 权威=”https://.auth0.com";
o、 ClientId=“”;
o、 ClientSecret=“”;
o、 CallbackPath=“/cb_openIdConnect”;
o、 SaveTokens=true;
o、 事件=新的OpenIdConnectEvents()
{
OnRedirectToIdentityProvider=rc=>
{
rc.ProtocolMessage.SetParameter(“受众”、“资源API服务器”);
返回Task.CompletedTask;
}
};
})
这真的很奇怪,因为我可以通过代码流和作用域openid电子邮件配置文件
在postman中获得这两个令牌(访问和id)
auth0.com上的教程还显示,具有附加作用域的.AddOpenIdConnect()也可以获取访问令牌。
非常混乱
那么,哪一个用于哪种情况?OAuth 2.0框架描述了授予授权的总体模式,但没有定义如何实际执行身份验证
OpenID Connect
或OIDC
是一个OAuth扩展,它添加并严格定义了用于返回用户信息的ID令牌-是OAuth 2.0的一个概要文件,它定义了身份验证的工作流
因此,如果我的mvc应用程序需要知道谁是用户,我需要使用.AddOAuth()
建议使用OIDC,OpenID connect将为您提供一个访问令牌和一个id令牌。id令牌是一个JWT,包含有关经过身份验证的用户的信息。您的客户端应用程序将在AddOpenIdConnect
扩展的帮助下验证令牌,解码令牌以获取用户的配置文件信息
但是您仍然可以使用AddOAuth
,区别在于OAuth需要您从IDP获取访问令牌,以访问身份提供者的用户管理端点,该端点返回用户的配置文件信息
如果我需要代表当前用户从mvc应用程序调用资源服务,我需要添加AddOpenIdConnect()以获取访问令牌
OIDC是OAuth扩展,所以您可以使用其中任何一个来获取访问受保护资源的访问令牌
这真的很奇怪,因为我可以在postman中通过代码流和scope openid电子邮件配置文件获得这两个令牌(访问和id)。
auth0.com上的教程还显示,具有附加作用域的.AddOpenIdConnect()也可以获取访问令牌。非常混乱
openid电子邮件配置文件
是OIDC范围。如果使用代码流,则不提供作用域,只提供OIDC的作用域,还包括承载访问令牌。这是为了确保令牌响应符合OAuth 2.0规范。对于仅请求ID令牌的基本OpenID身份验证请求,此访问令牌是标称的,可以安全地忽略。但是,当在UserInfo端点请求访问用户配置文件数据时,访问令牌将发挥作用
但是,当您想要获取访问受保护资源/API的访问令牌时,您需要在IDP(Auth0)上注册资源并添加OIDC作用域,以便Auth0可以请求用户同意获取访问令牌。您好,非常感谢您的回答。当我说“我的mvc应用程序需要知道我需要使用的用户是谁。AddOAuth()”时,我可能不正确。。应该是。AddOpenIdConnect。更正。但仍然不清楚。您说通过使用.AddOpenIdConnect()访问承载令牌作为额外信息提供?这是否意味着.AddOpenIdConnect()使用起来“更好”,因为它将同时提供令牌、id\u令牌和access\u令牌?那么,当用户应该被认证和授权调用api时,应该使用什么方法呢?
你说通过使用.AddOpenIdConnect()访问承载令牌作为额外信息提供?
它提供包含用户信息的ID令牌。这是否意味着.AddOpenIdConnect()更好要使用,因为它将同时提供令牌、id_令牌和access_令牌
,如果您的应用程序希望在身份验证期间更方便地获取用户信息,并希望在令牌过期时刷新access令牌,则可以使用OIDC。另见:好的。酷。本文深入讨论了Oauth/Oidc的差异。困扰我的是.AddOpenIdConnect()HttpContext.GetTokenAsync(“访问令牌”)不返回令牌,只返回id\u令牌。然后,为了获得访问权,应使用\u token.AddOauth()。。除非我以错误的方式使用它。@VitaliyMarkitanov,这通常是因为使用了错误的流,请尝试设置ResponseType
t