自己的承载令牌认证

本文关键字:认证 令牌 自己的 | 更新日期: 2023-09-27 18:18:44

我有一些与承载令牌相关的问题。在Owin中,您可以像这样保护票Protect(ticket):

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)

现在标记将是这样的:

nqak-9R6U64Owsm_lqn_mJzKc_Djd8iVnIw0EX77v5x2rybhf4m_zg_UnrsoO5BxDZQl0HWrSvvd4efa4ChNSf5rAGhd13aOXZlvwOJOZ5v_9bhRCq8A7tqHyiM6DqVVOyYs3lh2SU-wU1m85HH2IcYDtdTY3ijaKZ_QnP1nsqO5LRnnEL4upbETPW9zqWIZzZBX7_Y2cXi2v0K7WnlRor3gFKIZlU9J-NfidRpWXqq5744NfWWHalYADGS7eUWyuxPJCj9ykHYzaXFksJEXBw

我的问题:

  • 这个令牌是如何生成/加密的?

  • 是否有可能有人试图弄乱令牌并向其添加一些自定义声明?

的例子:

如果你有令牌字符串,你可以这样做:

AuthenticationTicket ticket = OAuthAuthorizationServerOptions.AccessTokenFormat.Unprotect(token);

现在您可以向它添加自定义声明。例如,如果有一个值为userrole声明,那么您可以修改该声明并添加admin,然后重新编码票证,您将获得一个具有管理员角色的令牌。

我实际上做了一些测试,在服务器上编码了一个令牌,然后尝试在另一个系统上修改它,但我不能Unprotect它。因此,我认为也许票据是使用最初创建的机器密钥加密/解密的。但是,如果我尝试从同一台机器Unprotect它工作。我可以解密并修改它

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

自己的承载令牌认证

这个令牌是如何生成/加密的?

可以在IAppBuilder对象上使用SetDataProtectionProvider扩展方法设置数据保护提供程序。如果不这样做,则使用主机的数据保护提供程序。如果是IIS + ASP。这是Microsoft.Owin.Host.SystemWeb程序集中的MachineKeyDataProtector。对于自托管,这将是DPAPI。基本上,令牌被加密,然后被MACed,这就是Protect()的全部内容。

是否有可能有人试图弄乱令牌并向其添加一些自定义声明?

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