ASP.NET OAuth:访问令牌是如何生成的?

ASP.NET OAuth: How is access token generated?

我正在从 this great tutorial 学习 ASP.NET 中的访问令牌和 OAuth ...我有一个问题。

在链接的文章中,作者说:

Now generating the token happens behind the scenes when we call “context.Validated(identity)”.

幕后究竟发生了什么?只是我很好奇,我不喜欢黑盒子,我喜欢了解背后的代码,因为它通常可以帮助我了解全局。

我想看看负责令牌生成的部分。我发现 Validated 基本上 just sets some properties 但我找不到生成访问令牌字符串的位置。

另外,只是为了实验和学习(所以请不要因为"inventing my own security"而骂我),是否可以定义自己的方式encode/decode 那些代币?

找到了!

OAuthAuthorizationServerOptions 中,您可以指定 AccessTokenFormat 类型 ISecureDataFormat<AuthenticationTicket> 的属性。

接口ISecureDataFormat<T>非常简单,只有两个方法:Protect(T data)Unprotect(string protectedText)。因此,如果您想要自己的访问令牌格式,只需实现此接口并指定一个新实例作为您的 AccessTokenFormat。

默认实现似乎是 SecureDataFormat (source here),它使用 IDataSerializer<T>IDataProtectorITextEncoder ...它使用序列化器来将对象序列化为字节,然后通过保护器将其放入,结果最终通过文本编码器...Unprotect 是相同的东西,只是方向相反。

那么,IDataSerializer<T>IDataProtector 的默认实现是什么?有three serializers in OWIN and it sure seems the one used to serialize tickets is the TicketSerializer (source here)

IDataProtector 似乎实现为 DpapiDataProtector (source) which uses class of the same name from a System.Security.Cryptography namespace and that seems to be closed source thought the Protect and Unprotect methods are inherited from DataProtector class

我不知道 "Dpapi" 是什么,所以我用谷歌搜索并在 this article from 2001 中发现了一个名为 Windows 数据保护 的东西。 .

我希望这对其他人有用。