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