2017-01-09 45 views
2

我使用MS Identity,當我使用重置令牌重置密碼,我得到這個異常:重置密碼導致System.Security.Cryptography.CryptographicException

內部異常類型:內部例外: 數據保護操作失敗。這可能是因爲沒有爲當前線程的 用戶上下文加載用戶配置文件導致的 ,這可能是線程模擬時的情況。

這是代碼的樣子:

var TheProvider = new DpapiDataProtectionProvider(); 
UserManager<IdentityUser> TheUserManager = new UserManager<IdentityUser>(new UserStore<IdentityUser>()); 
TheUserManager.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(TheProvider.Create("EmailConfirmation")); 

string TheResetCode = TheUserManager.GeneratePasswordResetToken(TheUserMembershiptID); 

IdentityResult TheResult = TheUserManager.ResetPassword(TheUserMembershiptID, TheResetCode, TheNewPassword); 

我有什麼作品我的本地機器上,但不是當我把它的服務器上。我環顧四周,但我還沒有找到解決方案。我需要改變以使其工作?

+1

任何理由像這樣手動構造令牌提供程序?不使用由框架構建的一個? – trailmax

+0

@trailmax:我向所有選項開放。 – frenchie

+0

在這種情況下,請嘗試以下解決方案:http://tech.trailmax.info/2014/06/asp-net-identity-and-cryptographicexception-when-running-your-site-on-microsoft-azure-web-sites/看看它是否是同樣的問題。 – trailmax

回答

1

這裏的假設是,您至少使用Identity的第3版以及OWIN和實體框架。

不要每次都手動創建數據保護提供程序。從應用程序構建器啓動時獲取它並存儲供用戶管理器使用。

public static class Auth { 
    internal static IDataProtectionProvider DataProtectionProvider { get; private set; } 
} 

public partial class Startup { 
    public void ConfigureAuth(IAppBuilder app) { 
     Auth.DataProtectionProvider = app.GetDataProtectionProvider(); 
     //...other code removed for brevity 
    } 
} 

配置一個的DbContext會員信息,持久性

public class MyIdentityDbContext : IdentityDbContext<IdentityUser> { 
    public MyIdentityDbContext() 
     : base("MembershipConnection") { } 

    public static MyIdentityDbContext Create() { 
     return new MyIdentityDbContext(); 
    } 
} 

現在創建一個UserManager派生類並將其配置爲使用數據保護提供

public class IdentityUserManager : UserManager<IdentityUser> { 

    private IdentityUserManager() 
     : base(new UserStore<IdentityUser>(MyIdentityDbContext.Create())) { 
     //...other code removed for brevity 

     var dataProtectionProvider = Auth.DataProtectionProvider; 
     if (dataProtectionProvider != null) { 
      this.UserTokenProvider = new DataProtectorTokenProvider<IdentityUser>(dataProtectionProvider.Create("UserToken")); 
     } 
    } 

    public static IdentityUserManager Create() { 
     return new IdentityUserManager(); 
    } 
} 

那麼現在假設你有一個用戶註冊在持久性存儲中,您應該能夠生成令牌並重置密碼。

var userManager = IdentityUserManager.Create(); 

var resetToken = await userManager.GeneratePasswordResetTokenAsync(id); 

var result = await userManager.ResetPasswordAsync(id, resetToken, newPassword); 

現在根據您在在發表評論時,它很可能是在宿主(假設IIS)的Load User Profile需要被設置爲true

報價this答案

我有同樣的問題,只是我被託管在Amazon EC2上。我可以通過轉到IIS中的應用程序池並在 用戶配置文件= true的情況下(在右鍵單擊後在 高級設置中)設置過程模型來解決此問題 - 。

如果是這樣的話,你沒有訪問到服務器能夠像你在評論中指出,以改變該設置,那麼就沒有多少人,社區可以提供一個尚未已經在遇到這個特定問題的帖子中報道。

+0

這原來是解決方案。 – frenchie

1

這是IIS的配置問題。轉到應用程序池高級設置,然後將選項「加載用戶配置文件」設置爲True

+0

我看到這個選項作爲答案在別處,但我沒有訪問IIS,它是共享主機(現在)。 – frenchie