C# OWIN承载令牌认证

C# OWIN承载令牌认证,c#,oauth-2.0,owin,asp.net-identity-2,bearer-token,C#,Oauth 2.0,Owin,Asp.net Identity 2,Bearer Token,我有一些关于持票人代币的问题。在Owin中,您可以像这样保护票据保护(票据): ClaimsIdentity identity = new ClaimsIdentity(Startup.OAuthServerOptions.AuthenticationType); identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName)); Dictionary<string, string> properties = new Di

我有一些关于持票人代币的问题。在Owin中,您可以像这样保护票据
保护(票据)

ClaimsIdentity identity = new ClaimsIdentity(Startup.OAuthServerOptions.AuthenticationType);

identity.AddClaim(new Claim(ClaimTypes.Name, user.UserName));

 Dictionary<string, string> properties = new Dictionary<string, string>();
 properties.Add("UserId", user.Id);
 properties.Add("UserName", user.UserName);
 properties.Add("Role", "user");

 AuthenticationProperties properties = new AuthenticationProperties(properties);

 AuthenticationTicket ticket = new AuthenticationTicket(identity, properties);


 DateTime currentUtc = DateTime.UtcNow;

 DateTime expireUtc = currentUtc.Add(TimeSpan.FromHours(24));

 ticket.Properties.IssuedUtc = currentUtc;
 ticket.Properties.ExpiresUtc = expireUtc;


 string token = OAuthAuthorizationServerOptions.AccessTokenFormat.Protect(ticket)
现在,您可以向其添加自定义声明。例如,如果有一个值为
user
role
声明,则您可以修改该声明并添加
admin
,然后对票据重新编码,并获得一个具有admin角色的令牌

实际上,我在一些测试中,在服务器上编码了一个令牌,然后尝试在另一个系统上修改它,但我无法
取消对它的保护。因此,我认为可能是使用最初创建的机器密钥对票据进行加密/解密。但是,如果我试图从同一台机器上取消对它的保护,它就会工作。我可以解密并修改它

有人能解释一下这个过程吗

如何生成/加密此令牌

可以使用
IAppBuilder
对象上的
SetDataProtectionProvider
扩展方法设置数据保护提供程序。如果未执行此操作,则使用主机的数据保护提供程序。对于IIS+ASP.NET,这是程序集
Microsoft.Owin.Host.SystemWeb
中的
MachineKeyDataProtector
。对于自托管,这将是DPAPI。基本上,令牌是经过加密的,然后进行锤击,这就是
Protect()
的全部内容

有没有可能有人会试图弄乱代币,并向其添加一些自定义>声明


不,这是不可能的。在计算机中受保护的令牌不能在其他地方解除保护。例外情况是web场中有多台机器。一台机器可以进行保护,如果后续请求转到另一台机器,该机器应该能够取消保护。对于DPAPI,这是不可能的。使用
MachineKeyDataProtector
,可以通过在所有机器中使用相同的
machineKey
部分来实现这一点。但是,如果您担心某个MITM能够做到这一点,那么不,这是不可能的。

我在测试它时也有同样的想法,但希望确保我走的是正确的道路!谢谢你的澄清。如果中间的人得到了<代码>脸谱网< /Cord>令牌,他能冒充用户吗?在默认数据保护提供者上进一步阅读:这里是一个使用“代码> MachineKeyDataProtector < /代码> >解密OAuth-2承载令牌的例子。传说值得一提的是,工具需要秘密/机器密钥。同样的道理。
AuthenticationTicket ticket = OAuthAuthorizationServerOptions.AccessTokenFormat.Unprotect(token);