2015-12-30 41 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; 
    } 

一旦生成電子郵件的UI具有以下這被執行,並且提供JS角代碼要使用的用戶標識和令牌。 Angular 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

我收到錯誤「Invalid Token」 – Rash

回答

1

我找到了解決這個問題的方法。如果有人遇到同樣的問題,我會發布它。在我的情況下,服務和Web API位於不同的服務器上。不同的機器鍵導致了這個問題。所以我爲我的Web應用程序生成了機器密鑰,並在身份服務的web.config文件中發佈了相同的機器密鑰。之後,它的工作。有關生成機器密鑰的更多信息,以下鏈接很有幫助。 http://gunaatita.com/Blog/How-to-Generate-Machine-Key-using-IIS/1058

+0

謝謝,在web.config文件中添加相同的機器密鑰也解決了我們的問題。 –