2014-11-25 6 views
4

В моем приложении Api 2 Identity 2 после регистрации пользователя У меня есть одна запись в одной таблице: AspNetUsers. Я использую следующий запрос HTTP, чтобы получить маркер:Где находится информация о токене авторизации, хранящемся на сервере ASP.NET WEB API?

POST https://localhost:44304/Token HTTP/1.1 
Accept: application/json 
Content-type: application/x-www-form-urlencoded 
Accept-Encoding: gzip 
Content-Length: 68 
Host: localhost:44304 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/UNAVAILABLE (java 1.4) 

grant_type=password&[email protected]&password=123456 

и я получаю ответ с access_token:

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Length: 695 
Content-Type: application/json;charset=UTF-8 
Expires: -1 
Server: Microsoft-IIS/8.0 
X-SourceFiles: =?UTF-8?B?QzpcVXNlcnNcU2VyZ2V5XERvY3VtZW50c1xWaXN1YWwgU3R1ZGlvIDIwMTNcUHJvamVjdHNcbXZjX3dlYmFwaVxXZWJBcHBsaWNhdGlvblxXZWJBcHBsaWNhdGlvblxUb2tlbg==?= 
X-Powered-By: ASP.NET 
Date: Tue, 25 Nov 2014 17:40:07 GMT 

{"access_token":"gsvW23e1...} 

После того как я получил маркер не один рекорд не будет добавлен в базу данных. Тем не менее в таблице AspNetUsers есть только одна запись. Информация о выпущенном токене не хранится в любой таблице базы данных.

Я использую следующий код в контроллере Web API для аутентификации пользователя:

var currentUser = manager.FindById(User.Identity.GetUserId()); 
if (currentUser == null) 
{ 
    HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
    return ResponseMessage(response); 
} 

После этого я выполнить изменение пароля и пытаюсь вызвать некоторый веб-апите метод контроллера, используя старую access_token (который я получил до смены пароля) и access_token остается в силе! CurrentUser не является нулевым! Я прочитал еще темы на StackOverflow ASP.Net Identity sign-out all sessions ASP.Net Identity Logout и BlogPost https://timmlotter.com/blog/asp-net-identity-invalidate-all-sessions-on-securitystamp-update/ , но я до сих пор не понимаю, где хранится информация о выданных жетонов. Итак, мои вопросы: 1) Где хранится информация о access_token на сервере? 2) Почему после смены пароля я все еще могу использовать access_token, который выдается сервером до смены пароля? 3) Как аннулировать все access_token, выпущенные до смены пароля?

ответ

4

1) Токены не хранятся нигде в базе данных или локальном хранилище. Это означает, что токены не хранятся нигде на сервере.

2) На самом деле, маркеры сброса пароля сгенерированы с использованием SecurityStamp и проверяются на SecurityStamp пользователя. Токены не истекают, если вы не установили срок действия или обновили SecurityStamp этого пользователя.

Время истечения срока действия может быть установлено в свойствах userManager в вашем классе конфигурации идентификации. В следующем примере показано время жизни токена с 1 часом. Проверьте статью this.

if (dataProtectionProvider != null) 
{ 
    manager.UserTokenProvider = 
     new DataProtectorTokenProvider<ApplicationUser> 
      (dataProtectionProvider.Create("ASP.NET Identity")) 
      {      
      TokenLifespan = TimeSpan.FromHours(1) 
      }; 
} 

Вы можете использовать собственный механизм для проверки того, что маркер уже используется.

3) Обновите SecurityStamp. Это приведет к аннулированию всех токенов, выпущенных для этого пользователя, включая файлы cookie. Было бы лучше использовать вашу собственную идею для истечения срока действия маркеров сброса пароля.

В качестве примера вы можете использовать другой столбец для хранения всех сгенерированных маркеров сброса пароля в базе данных и проверки его (может быть, это лучший способ сделать это).

Помните, что имя пользователя login_token сгенерировано по-разному, и у него есть время истечения, установленное вами в токене на предъявителя Owin.

Надеюсь, это поможет.

+0

После изменения пароля поле SecurityStamp изменяется. Но диспетчер вызовов. FindById (User.Identity.GetUserId()) по-прежнему возвращает NOT null, когда я вызываю некоторый метод контроллера web-api со старым маркером-носителем Авторизация: Bearer gsvW23e1 ... Я думаю, что manager.FindById (User.Identity.GetUserId()) должен возвращать значение null после смены пароля (SecurityStamp change), если я пытаюсь вызвать метод web api, используя старый (выданный до изменения пароля) токен-носитель для авторизации. – Sergey

Смежные вопросы