2015-12-30 5 views
0

У меня возникла проблема с подтверждением электронной почты нового пользователя. Подтверждение электронной почты работает в течение первых 20 минут, но через 50 минут связь истекает. Я установил время истечения маркера до 24 часов. Пожалуйста, помогите мне в решении этой проблемы. Я застрял на этом в течение последних 2 дней :(Мой код выглядит следующим образом:. Я настройки маркера жизни в Create() метод в ApplicationUserManager следующим образом:Метод ConfirmEmailAsync() не работает

 var dataProtectionProvider = options.DataProtectionProvider; 

     if (dataProtectionProvider != null) 
     { 
      userManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")) 
      { 
       TokenLifespan = _settings.ConfirmationAndResetTokenExpirationTimeSpan 
      }; 
     } 

, а затем в AccountsController, Создать метод для нового пользователя geiven ниже. метод SendEmailAsync состоит из электронной почты субъекта, электронной почты тела, сгенерированный пароль и обратного вызова URI.

[Authorize(Roles = Roles.Bam.Name.Admin)] 
    [HttpPost] 
    [Route(Routes.Accounts.Template.Create, Name = Routes.Accounts.Name.Create)] 
    public async Task<IHttpActionResult> Create(CreateUserBindingModel createUserBindingModel) 
    { 
     IHttpActionResult result; 


      var memberNameExists = UserManager.Users.Any(x => x.MemberName.ToLower() == createUserBindingModel.MemberName.ToLower()); 

      if (!memberNameExists) 
      { 
       var applicationUser = new ApplicationUser 
       { 
        UserName = createUserBindingModel.Email, 
        Email = createUserBindingModel.Email, 
        FirstName = createUserBindingModel.FirstName, 
        LastName = createUserBindingModel.LastName, 
        Company = createUserBindingModel.Company, 
        Location = createUserBindingModel.Location, 
        PhoneNumber = createUserBindingModel.PhoneNumber, 
        MemberName = createUserBindingModel.MemberName, 
        LastLoginDate = SqlDateTime.MinValue.Value, 
        CreateDate = DateTime.Now, 
        CreatedBy = User.Identity.GetUserId(), 
        UpdateDate = DateTime.Now, 
        UpdatedBy = User.Identity.GetUserId(), 
        TwoFactorEnabled = createUserBindingModel.TwoFactorEnabled, 
        SecurityResetRequired = true, 
        PasswordExpirationDate = DateTime.Now.AddDays(Convert.ToDouble(ConfigurationManager.AppSettings["PasswordExpirationDays"])) 
       }; 

       if (!string.IsNullOrEmpty(createUserBindingModel.AvatarBase64)) 
       { 
        var avatarBytes = Convert.FromBase64String(createUserBindingModel.AvatarBase64); 
        var resizedAvatarBytes = ImageResizer.ResizeImage(avatarBytes, _avatarWidth, _avatarHeight); 

        applicationUser.UserAvatar = new ApplicationUserAvatar 
        { 
         Avatar = resizedAvatarBytes 
        }; 
       } 

       var generatedPassword = PasswordGenerator.GenerateStrongPassword(10, 10); 

       var identityResult = await UserManager.CreateAsync(applicationUser, generatedPassword); 

       if (identityResult.Succeeded) 
       { 
        await UserManager.AddToRolesAsync(applicationUser.Id, createUserBindingModel.Roles.ToArray()); 

        var token = await UserManager.GenerateEmailConfirmationTokenAsync(applicationUser.Id); 
        var callbackUri = string.Format("{0}?userId={1}&token={2}", createUserBindingModel.EmailConfirmationCallbackUri, applicationUser.Id, HttpUtility.UrlEncode(token)); 

        await UserManager.SendEmailAsync(applicationUser.Id, Email.Confirmation.Subject, string.Format(Email.Confirmation.Body, string.Format("{0} {1}", applicationUser.FirstName, applicationUser.LastName), callbackUri, generatedPassword, _settings.AccessTokenExpirationTimeSpan.TotalHours)); 

        var userUrl = new Uri(Url.Link(Routes.Accounts.Name.Get, new { id = applicationUser.Id })); 
        var roles = await UserManager.GetRolesAsync(applicationUser.Id); 
        var contract = _accountsMapper.ToContract(applicationUser, roles); 

        result = Created(userUrl, contract); 
       } 
       else 
       { 
        result = GetErrorResult(identityResult); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError(string.Empty, "Member Name already exists!"); 

       result = BadRequest(ModelState); 
      } 
     return result; 
    } 

После того, как электронная почта генерируется пользовательский интерфейс имеет следующие JS углового кода, который запускается на выполнение, и обеспечить идентификатор пользователя и токен для обслуживания. Угловой код JS:

angular.module('confirmEmailModule').factory('confirmEmailFactory', function ($http) { 
var factory = {}; 

factory.confirmEmail = function(userId, token) { 

    var encodedToken = encodeURIComponent(token); 
    var uri = '/identity/api/accounts/confirmemail?userId=' + userId + '&token=' + token; 

    return $http.post(uri); 
} 

return factory; 

});

и Сервис:

[AllowAnonymous] 
    [HttpPost] 
    [Route(Routes.Accounts.Template.ConfirmEmail, Name = Routes.Accounts.Name.ConfirmEmail)] 
    public async Task<IHttpActionResult> ConfirmEmail([FromUri] string userId, [FromUri] string token) 
    { 
     //var decodedToken = HttpUtility.UrlDecode(token); 
     var identityResult = await UserManager.ConfirmEmailAsync(userId, token); 
     var result = identityResult.Succeeded ? StatusCode(HttpStatusCode.NoContent) : GetErrorResult(identityResult); 

     return result; 
    } 

Пожалуйста, советы.

+0

Какая у вас ошибка при отладке, попробуйте отправить простое электронное письмо без ссылки истечения срока действия, а затем пойдите для него. –

+0

Я получаю сообщение об ошибке «Недопустимый токен» – Rash

ответ

1

Я нашел решение этой проблемы. Я отправляю его, если кто-то сталкивается с той же проблемой. В моем случае службы и веб-API были на разных серверах. Эта проблема вызвала разные машинные клавиши. Поэтому я создал машинный ключ для своего веб-приложения и разместил один и тот же машинный ключ в файле web.config службы Identity. После этого все получилось. Для получения дополнительной информации о генерации машинного ключа полезно использовать следующую ссылку. http://gunaatita.com/Blog/How-to-Generate-Machine-Key-using-IIS/1058

+0

Спасибо, добавив тот же машинный ключ в файл web.config, исправил и нашу проблему. –

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