C# 如何在基于令牌的机制中验证访问令牌以访问受保护的资源?

C# 如何在基于令牌的机制中验证访问令牌以访问受保护的资源?,c#,asp.net-web-api,oauth-2.0,owin,bearer-token,C#,Asp.net Web Api,Oauth 2.0,Owin,Bearer Token,我想做一个基于令牌的机制,在这个机制中,我将拥有支持多个客户端的SPA或移动应用程序 我的web服务引擎和我的应用程序的用例: 我的web应用程序:客户端将注册他们的应用程序SPA或移动应用程序。他们将在注册时获得客户端id。在SPA或移动应用程序的情况下,只有客户端id作为密钥会被泄露,因此我只提供客户端id Web服务引擎:支持多个客户端,在登录到客户端各自的应用程序后管理每个用户的会话 假设有两个客户端已将其应用程序注册到我的web应用程序中: 客户1:MyApp1 客户2:MyApp2

我想做一个基于令牌的机制,在这个机制中,我将拥有支持多个客户端的SPA或移动应用程序

我的web服务引擎和我的应用程序的用例:

我的web应用程序:客户端将注册他们的应用程序SPA或移动应用程序。他们将在注册时获得客户端id。在SPA或移动应用程序的情况下,只有客户端id作为密钥会被泄露,因此我只提供客户端id

Web服务引擎:支持多个客户端,在登录到客户端各自的应用程序后管理每个用户的会话

假设有两个客户端已将其应用程序注册到我的web应用程序中:

客户1:MyApp1

客户2:MyApp2

现在,如果MyApp1有两个John和Stephen用户,并且他们登录MyApp1,那么我希望使用基于令牌的机制为这些用户管理会话。现在,如果John和Stephen想要访问受保护的资源,那么他们只能通过有效的accesstoken进行访问

MyApp2也是如此

对于基于令牌的机制,我看到了很多问题,只涉及以下这篇文章:

但在上述教程和大部分教程中,唯一令人困惑的部分是在验证用户名和密码并生成访问令牌之后。上面的教程是否将访问令牌存储在服务器端cookie中,以便在请求访问受保护的资源时验证accesstoken

我真的很困惑。我知道accesstoken验证发生在[Authorize attribute]中,但如果不存储accesstoken,我就无法了解上述教程如何验证accesstoken


我的想法可能是,当访问受保护资源的请求到来时,访问令牌会根据webconfig中的机器密钥属性进行加密或解密,这就是在[Authorize]属性中验证访问令牌的方式,但我对此并不确定。

应用程序不需要在服务器端存储访问令牌,它将只从传递的令牌中读取用户

当请求到达身份验证服务器时,该服务器在ConfigureOAuth()方法中连接到Owin管道,
HTTP头令牌被解密,令牌中的用户数据被保存到上下文的当前用户。

应用程序不需要存储访问令牌服务器端,它将仅从传递的令牌中读取用户

当请求到达身份验证服务器时,该服务器在ConfigureOAuth()方法中连接到Owin管道,
HTTP头令牌被解密,令牌中的用户数据被保存到上下文的当前用户。

这是长期困扰我的问题之一

我不确定我是否理解您为什么要给出2个应用程序的示例,但令牌机制实际上很简单,但当您使用owin和identity时,它有点像黑盒子一样

令牌不存储在服务器或数据库中的任何位置,登录时对用户的身份验证是使用您的逻辑完成的,或者通常再次使用黑盒标识完成的,这涉及验证安全密码等

在此之后,将生成令牌(通常使用标识),或者如果您手动执行此操作,这将涉及使用您希望存储在令牌中的任何信息来保护令牌

当用户下次发送请求时,他应该传递令牌,而您需要对其进行解密并验证所需内容(例如过期时间),所有这些通常都是在幕后完成的


有趣的是:即使您完全更改了数据库,令牌仍然有效,用户id甚至不存在于您的新数据库中!但是,当标识与securityStamp比较时,它当然会自动使这个令牌无效这是长期困扰我的问题之一

我不确定我是否理解您为什么要给出2个应用程序的示例,但令牌机制实际上很简单,但当您使用owin和identity时,它有点像黑盒子一样

令牌不存储在服务器或数据库中的任何位置,登录时对用户的身份验证是使用您的逻辑完成的,或者通常再次使用黑盒标识完成的,这涉及验证安全密码等

在此之后,将生成令牌(通常使用标识),或者如果您手动执行此操作,这将涉及使用您希望存储在令牌中的任何信息来保护令牌

当用户下次发送请求时,他应该传递令牌,而您需要对其进行解密并验证所需内容(例如过期时间),所有这些通常都是在幕后完成的


有趣的是:即使您完全更改了数据库,令牌仍然有效,用户id甚至不存在于您的新数据库中!但是,当标识与securityStamp比较时,它当然会自动使该令牌无效。您可以控制令牌中的信息。请参阅本文中的SimpleAuthorizationServerProvider类:

var identity = new ClaimsIdentity(context.Options.AuthenticationType);
identity.AddClaim(new Claim("sub", context.UserName));
identity.AddClaim(new Claim("role", "user"));
使用声明来存储您需要的关于用户、他们的用户名或角色的任何信息,这就是您提到的文章中所发生的事情。 生成的令牌已包含有关用户的信息

这摘自文章:

第二种方法“GrantResourceOwnerCredentials”负责 验证发送到授权服务器的用户名和密码 标记端点,因此我们将使用我们创建的“AuthRepository”类 然后调用方法“FindUser”,检查用户名和 密码是有效的

如果凭证有效,我们将创建“ClaimsIdentity”类和 将身份验证类型传递给它,在我们的例子中是“承载令牌”,然后 我们将添加两个索赔(“子索赔”、“角色索赔”),这些索赔将包含在 签名令牌。您可以添加不同的声明