Подтвердить что ты не робот

Аутентификация маркера предъявителя OWIN

У меня есть некоторые вопросы, связанные с Toker 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 с той же машины, он работает. Я могу расшифровать его и изменить его.

Может кто-нибудь объяснить этот процесс, пожалуйста?

4b9b3361

Ответ 1

Как генерируется/зашифровывается этот токен?

Поставщик защиты данных может быть установлен с использованием метода расширения SetDataProtectionProvider для объекта IAppBuilder. Если этого не сделать, используется поставщик защиты данных хоста. В случае IIS + ASP.NET это MachineKeyDataProtector в сборке Microsoft.Owin.Host.SystemWeb. Для самостоятельного хостинга это будет DPAPI. В принципе, токен зашифрован, а затем MACed, и это то, о чем Protect().

Есть ли какие-либо шансы, что кто-то может попытаться mess'up с токеном и добавить некоторые пользовательские > претензии к нему?

Нет. Это невозможно. Токен, защищенный в машине, не может быть защищен в другом месте. Исключением будет случай веб-фермы, где у вас есть несколько машин. Одна машина может защитить, и если последующий запрос переходит к какой-либо другой машине, эта машина должна иметь возможность снимать защиту. С DPAPI это невозможно. С MachineKeyDataProtector, это возможно, имея тот же раздел machineKey на всех машинах. Но тогда, если вы обеспокоены тем, что какой-то MITM может это сделать, тогда нет, это невозможно.