Oauth 2.0 跨多个服务使用Oauth票证?

Oauth 2.0 跨多个服务使用Oauth票证?,oauth-2.0,owin,Oauth 2.0,Owin,我目前有一对基于OWIN的服务,每个服务对同一组用户使用OAuth身份验证。我打算隔离授权服务器(即令牌端点),并以某种方式配置我的两个服务以接受此令牌。我假设这将涉及我的所有服务的一些配置,以允许在所有相关服务中解密此令牌。这可能吗?Katana OAuth2授权服务器中间件并不是针对这种情况设计的(主要是因为它依赖machinekey进行令牌验证) 如果您希望集中令牌生成,那么您应该研究专门为此设计的OAuth2授权服务器。Thinktecture AuthorizationServer是一

我目前有一对基于OWIN的服务,每个服务对同一组用户使用OAuth身份验证。我打算隔离授权服务器(即令牌端点),并以某种方式配置我的两个服务以接受此令牌。我假设这将涉及我的所有服务的一些配置,以允许在所有相关服务中解密此令牌。这可能吗?

Katana OAuth2授权服务器中间件并不是针对这种情况设计的(主要是因为它依赖machinekey进行令牌验证)


如果您希望集中令牌生成,那么您应该研究专门为此设计的OAuth2授权服务器。Thinktecture AuthorizationServer是一款开源服务器,它可以做到这一点:

在原始帖子的评论中与Brock Allen交谈后,我不能保证这是一个好的/安全的解决方案,但这是我最终使用的代码。(注意:此代码的一个版本可从以下网站获得。)

我创建了一个使用AES的IDataProtector实现:

内部类AesDataProtectorProvider:IDataProtector
{
//田地
专用字节[]密钥;
//建设者
公共AesDataProtectorProvider(字符串键)
{
使用(var sha1=new SHA256Managed())
{
this.key=sha1.ComputeHash(Encoding.UTF8.GetBytes(key));
}
}
//IDataProtector方法
公共字节[]保护(字节[]数据)
{
字节[]数据哈希;
使用(var sha=new SHA256Managed())
{
dataHash=sha.ComputeHash(数据);
}
使用(AESSManaged aesAlg=新AESSManaged())
{
aesAlg.Key=此.Key;
aesAlg.GenerateIV();
使用(var encryptor=aesAlg.CreateEncryptor(aesAlg.Key,aesAlg.IV))
使用(var msEncrypt=new MemoryStream())
{
msEncrypt.Write(aesAlg.IV,0,16);
使用(var csEncrypt=newcryptostream(msEncrypt,encryptor,CryptoStreamMode.Write))
使用(var bwEncrypt=newbinarywriter(csEncrypt))
{
bwEncrypt.Write(dataHash);
bwEncrypt.Write(数据长度);
bwEncrypt.Write(数据);
}
var protectedData=msEncrypt.ToArray();
返回受保护的数据;
}
}
}
公共字节[]取消保护(字节[]受保护数据)
{
使用(AESSManaged aesAlg=新AESSManaged())
{
aesAlg.Key=此.Key;
使用(var msDecrypt=新内存流(protectedData))
{
字节[]iv=新字节[16];
msDecrypt.Read(iv,0,16);
aesAlg.IV=IV;
使用(var decryptor=aesAlg.CreateDecryptor(aesAlg.Key,aesAlg.IV))
使用(var csDecrypt=new CryptoStream(msDecrypt,decryptor,CryptoStreamMode.Read))
使用(var brDecrypt=新二进制读取器(csDecrypt))
{
var signature=brDecrypt.ReadBytes(32);
var len=brDecrypt.ReadInt32();
var data=brDecrypt.ReadBytes(len);
字节[]数据哈希;
使用(var sha=new SHA256Managed())
{
dataHash=sha.ComputeHash(数据);
}
如果(!dataHash.SequenceEqual(签名))
抛出新的SecurityException(“签名与计算的哈希不匹配”);
返回数据;
}
}
}
}
}
然后在ISecureDataFormat实现中使用它,如下所示:

公共类SecureTokenFormatter:ISecureDataFormat
{
//田地
私有票证序列化程序;
私人保护人;
专用ITextEncoder编码器;
//建设者
公共SecureTokeFormatter(字符串密钥)
{
this.serializer=new TicketSerializer();
this.protector=新AesDataProtectorProvider(键);
this.encoder=textcodeings.Base64Url;
}
//ISecureDataFormat成员
公共字符串保护(身份验证票证)
{
var ticketData=this.serializer.Serialize(票证);
var protectedData=this.protector.Protect(ticketData);
var protectedString=this.encoder.Encode(protectedData);
返回protectedString;
}
公共身份验证票证取消保护(字符串文本)
{
var protectedData=this.encoder.Decode(文本);
var ticketData=this.protector.Unprotect(protectedData);
var ticket=this.serializer.Deserialize(ticketData);
回程票;
}
}

然后,构造函数上的“key”参数可以在许多服务上设置为相同的值,它们都可以解密(“unprotect”)并使用票据

我知道这是一个老问题,但我有一个类似的用例。根据文档,OWIN OAuth使用机器密钥来保护数据。由于您控制所有实例,因此我认为只需在web配置中设置machinekey即可


参考:

您可以使用此nuget软件包

它包含IAppBuilder的扩展方法,允许您设置自己的密钥

appBuilder.UseAesDataProtectorProvider(key);

我在发帖后真的很幸运。服务器配置和承载令牌配置上都有AccessTokenFormat属性。我实现了ISecureDataFormat来序列化票据并使用AES进行加密。如果我对所有服务使用相同的密码密钥,则令牌似乎对每个服务都有效。你认为这种方法有什么问题吗?如果没有,我会写一个正确的答案。谢谢你的回复。扩展点当然在那里,所以这是可能的。不幸的是,他们把这些留给了一般开发人员来填写。这就是为什么它是不幸的——你