簡體   English   中英

重置Microsoft Identity上的密碼會導致System.Security.Cryptography.CryptographicException

[英]Resetting password on Microsoft Identity causes System.Security.Cryptography.CryptographicException

我正在使用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);

我在本地機器上工作的是什么,但是當我把它放在服務器上時卻沒有。 我環顧四周,但我還沒有找到解決方案。 我需要更改什么才能使其正常工作?

這是IIS的配置問題。 轉到應用程序池高級設置,並將“加載用戶配置文件”選項設置為True

這里的假設是您至少使用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);

現在根據你在帖子中的評論,很可能是主機中的Load User Profile (假設IIS)需要設置為true

引用這個答案

我有同樣的問題,除了我在亞馬遜ec2主辦。 我能夠通過轉到IIS中的應用程序池和(在右鍵單擊后的高級設置下)設置流程模型來解決它 - 加載用戶配置文件= true。

如果是這種情況,並且您無法訪問服務器以便能夠像您在評論中指示的那樣更改該設置,那么社區可以提供的其他內容並沒有在遇到的帖子中提及這個特殊問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM