2014-10-02 10 views
7

Wir arbeiten an einer neuen ASP.NET MVC 4.1-App. Wir binden die ASP.NET Identity-Inhalte ein und wir kämpfen mit Token für das Zurücksetzen des Kennworts und die neue Einladung. Ich kann anscheinend keine Möglichkeit finden, die Ablaufzeit für die generierten Token festzulegen, und sie scheint standardmäßig auf etwa 10 Minuten festgelegt zu sein. Wir verwenden einen EmailTokenProvider als Benutzer-Token-Anbieter, da er gut mit dem Sicherheitsstempel des Benutzers funktioniert.So stellen Sie den Ablauf des UserTokenProvider-Tokens ein

Wie können wir das Ablaufdatum für die Token festlegen - im Idealfall möchten wir es für die Einladung anders einstellen als die Passwort-Tokens zurücksetzen.

Unsere Benutzer Manager sieht wie folgt aus:

var manager = new UserManager<User, long>(new UserStore(new UserRepository())); 
manager.UserValidator = new UserValidator<User, long>(manager) {AllowOnlyAlphanumericUserNames = false, RequireUniqueEmail = true}; 
manager.UserTokenProvider = new EmailTokenProvider<User, long>(); 

Wenn ein Benutzer ein Passwort zurücksetzen Link rufen wir

var token = await _userManager.GeneratePasswordResetTokenAsync(user.Id); das Token zu bekommen, und das an den Benutzer weitergeben.

Wenn ein Benutzer eingeladen wird, rufen wir:

var token = await _userManager.GenerateUserTokenAsync("FirstLogin", user.Id);

das Token zu erhalten, und senden.

Antwort

2

Die Standardimplementierungen des Token-Anbieters in 2.0 nicht zulassen, dass Sie das Token ändern Verfall, dies ist etwas, was wir für Identität 3.0 in Betracht ziehen.

+1

Danke für das Update. Ich fand, dass die Verwendung des "DataProtectorTokenProvider" eine bessere Wahl für die längere Lebensdauer von Tokens ist. –

+1

Das ist ziemlich wertlos, zu dieser willkürlichen Ablaufzeit gibt es noch nicht einmal eine Dokumentation. – Cloud

+0

@ hao-kung können Sie bitte teilen, was ist die Standard-Reset-Passwort-Token Ablaufzeit? – vmachacek

1

Wenn ich Ihre Frage gut verstehen, könnte folgende helfen:

private static string CalculateToken(User user) 
    { 
     byte[] time = BitConverter.GetBytes(DateTime.UtcNow.ToBinary()); 
     byte[] key = BitConverter.GetBytes(user.ID); 
     string token = Convert.ToBase64String(time.Concat(key).ToArray()); 
     return token; 
    } 

Und dann:

DateTime time = DateTime.FromBinary(BitConverter.ToInt64(data, 0)); 
    int id = BitConverter.ToInt32(data, 8); 

    if (time< DateTime.UtcNow.AddMinutes(-10) || user.ID != id) 
      { 
       //too old or IDs not matching 
      } 
Verwandte Themen