2015-01-22 4 views
2

Мы используем Microsoft Identity Framework версии 2.0 в приложении веб-форм. Все работает хорошо. Мы решили, что хотим добавить проверку электронной почты как часть нового процесса настройки учетной записи. Если мы проверим токен после его создания на той же странице, мы будем успешными. Но если мы попытаемся проверить токен на другой странице, он терпит неудачу. Процесс очень прост:Точка проверки подлинности электронной почты Identity Identity Asp.net не распознана

  1. Администратор создает новую учетную запись, предоставляя электронную почту и имя пользователя. (мы не поддерживаем самостоятельную регистрацию).
  2. Пользователь щелкает ссылку, которую он получает по электронной почте, чтобы подтвердить, что письмо было получено.

Вот код, чтобы создать маркер проверки электронной почты:

var manager = new UserManager(); 
var user = new ApplicationUser() { UserName = EmailAddress.Text, Email = EmailAddress.Text, FirstName = FirstName.Text, LastName = LastName.Text }; 
IdentityResult result = manager.Create(user); 
var provider = new DpapiDataProtectionProvider(); 
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation")) 
{ 
    TokenLifespan = TimeSpan.FromHours(24) 
}; 
var strToken = manager.GenerateEmailConfirmationToken(user.Id); 
//IdentityResult validToken = manager.ConfirmEmail(user.Id, strToken); 
strToken = HttpUtility.UrlEncode(strToken.ToString()); 

ПРИМЕЧАНИЕ: Если раскомментировать строку, начинающуюся // IdentityResult validToken ..., то это удается.

Вот код на странице VerifyEmail:

string userid = Request.QueryString["id"].ToString(); 
string tokenReceived = Request.QueryString["token"].ToString(); 
//tokenReceived = HttpUtility.UrlDecode(tokenReceived); 
ApplicationUser User = new ApplicationUser(); 
var manager = new UserManager(); 
User = manager.FindById(userid); 
var provider = new DpapiDataProtectionProvider(); 
manager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation")) 
{ 
    TokenLifespan = TimeSpan.FromHours(24) 
}; 

IdentityResult validToken = manager.ConfirmEmail(User.Id, tokenReceived); 

Линия validToken не преуспевает в этом файле. Я подтвердил, что строки User.Id и tokenReceived соответствуют ТОЧНО в обоих файлах, поэтому нет никакого искажения URL-адресов. (Вот почему я прокомментировал UrlDecode, поскольку он, по-видимому, автоматически декодируется браузером - когда я пытаюсь декодировать, он не на 100% совпадает с строкой перед кодировкой).

Таким образом, я уверен, что мы вызываем тот же метод (ConfirmEmail) и что два переданных параметра являются точно такими же строками. Я также знаю, что токен может быть проверен только один раз, поэтому я не пытаюсь повторно использовать их после их проверки.

Любые идеи приветствуются.

ответ

2

Я думаю, что проблема в DpapiDataProtectionProvider. Если вы используете тот же экземпляр этого класса при создании и проверке токена, он будет работать нормально.

Любая причина, по которой вы не получаете UserManager от Owin Контекст согласно шаблону VC2013?

+0

FYI: Я понимаю, что создание глобального экземпляра этого класса будет работать, но вместо этого я просто предоставил имя приложения при создании: var provider = new DpapiDataProtectionProvider («MyApp»); Пока имя приложения одинаково в обоих местах, оно теперь работает. –

+0

Это хороший вопрос о 'AppName', иначе я думаю, что он использует guid и каждый раз, когда это новый guid. Параметр 'AppName' используется как часть ключей для криптографии. – trailmax