C# OWIN承载令牌认证
我有一些关于持票人代币的问题。在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
保护(票据)
:
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);