OWIN 承载令牌认证

Posted

技术标签:

【中文标题】OWIN 承载令牌认证【英文标题】:OWIN Bearer Token Authentication 【发布时间】:2014-10-11 14:23:28 【问题描述】:

我有一些与 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);

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

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

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

【问题讨论】:

【参考方案1】:

如何生成/加密此令牌?

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

是否有人可以尝试弄乱令牌并为其添加一些自定义 > 声明?

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

【讨论】:

我在测试时也是这么想的,但我想确保我走在正确的道路上!感谢您的澄清。 如果中间人拿到Facebook令牌,他能冒充用户吗? 进一步阅读默认数据保护提供商:msdn.microsoft.com/en-us/library/… 这是一个tool,它使用MachineKeyDataProtector解密 OAuth 2.0 Bearer 令牌 @Legends 值得一提的是,该工具需要密钥/机器密钥。 jwt.io 也一样。

以上是关于OWIN 承载令牌认证的主要内容,如果未能解决你的问题,请参考以下文章

Owin 身份令牌认证令牌端点以 404 响应

SailsJS v1.0 承载认证(API 令牌)

zuul:不接受承载认证

Auth0 - 在 Owin 上使用带有承载访问令牌的 JWT 使用 RS256 进行身份验证

如何将角色添加到 asp 身份承载令牌

owin Claims-based认证登录实现