OWIN承载令牌认证

时间:2014-08-18 15:50:00

标签: c# oauth-2.0 owin asp.net-identity-2 bearer-token

我有一些与Bearer Token有关的问题。在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);

现在您可以为其添加自定义声明。例如,如果role声明值为user,那么您可以修改该声明并添加admin然后重新编码故障单,并获得具有管理员角色的令牌。

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

有人可以解释这个过程吗?

1 个答案:

答案 0 :(得分:16)

  

如何生成/加密此令牌?

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

  

是否有人可能会尝试使用令牌进行混乱并添加一些自定义&gt;声称它?

没有。这是不可能的。机器中受保护的令牌不能在其他地方不受保护。例外情况是您拥有多台计算机的Web场。一台机器可以保护,如果后续请求进入其他机器,该机器应该具有解除保护的能力。使用DPAPI,这是不可能的。使用MachineKeyDataProtector,可以通过在所有计算机中使用相同的machineKey部分来实现。但是如果你担心一些MITM能够做到这一点,那么不,这是不可能的。