這裏的假設是,您至少使用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的情況下(在右鍵單擊後在 高級設置中)設置過程模型來解決此問題 - 。
如果是這樣的話,你沒有訪問到服務器能夠像你在評論中指出,以改變該設置,那麼就沒有多少人,社區可以提供一個尚未已經在遇到這個特定問題的帖子中報道。
任何理由像這樣手動構造令牌提供程序?不使用由框架構建的一個? – trailmax
@trailmax:我向所有選項開放。 – frenchie
在這種情況下,請嘗試以下解決方案:http://tech.trailmax.info/2014/06/asp-net-identity-and-cryptographicexception-when-running-your-site-on-microsoft-azure-web-sites/看看它是否是同樣的問題。 – trailmax