web-dev-qa-db-ja.com

OWINベアラートークン認証

ベアラートークンに関連する質問がいくつかあります。 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);

これで、カスタムクレームを追加できます。たとえば、値がroleuserクレームがある場合、そのクレームを変更してadminを追加し、チケットを再エンコードすると、管理者の役割を持つトークンを取得できます。

私は実際にいくつかのテストを行い、サーバーでトークンをエンコードしてから、別のシステムでそれを変更しようとしましたが、Unprotectできませんでした。したがって、チケットは最初に作成されたマシンキーを使用して暗号化/復号化されるのではないかと考えています。ただし、同じマシンからUnprotectしようとすると、機能します。復号化して変更できます。

誰かがこのプロセスを説明できますか?

14
David Dury

このトークンはどのように生成/暗号化されますか?

データ保護プロバイダーは、SetDataProtectionProviderオブジェクトのIAppBuilder拡張メソッドを使用して設定できます。これが行われない場合、ホストのデータ保護プロバイダーが使用されます。 IIS + ASP.NETの場合、これはアセンブリ_Microsoft.Owin.Host.SystemWeb_のMachineKeyDataProtectorです。セルフホスティングの場合、これはDPAPIになります。基本的に、トークンは暗号化されてからMAC化され、それがProtect()のすべてです。

誰かがトークンを台無しにして、それにカスタムクレームを追加しようとする可能性はありますか?

いいえ。これは不可能です。マシンで保護されているトークンは、他の場所で保護を解除することはできません。例外は、複数のマシンがあるWebファームの場合です。 1台のマシンで保護でき、後続の要求が他のマシンに送信された場合、そのマシンには保護を解除する機能が必要です。 DPAPIでは、これは不可能です。 MachineKeyDataProtectorを使用すると、すべてのマシンに同じmachineKeyセクションを設定することでこれが可能になります。しかし、MITMがこれを実行できることを懸念している場合は、いいえ、それは不可能です。

16
Badri