2016-09-23 24 views
0

所以我需要導入一堆用戶到我的基於ASP.NET身份的系統中,他的一些密碼很短(只有三個字符),並且超出了我的控制範圍。我需要導入這些密碼,以便現有用戶可以登錄並更改其密碼以滿足更嚴格的要求。ASP.NET身份密碼要求覆蓋我自己的

我認爲通過在我的ApplicationUserManager類中配置PasswordValidator屬性,我可以將導入密碼的要求設置爲允許我導入現有用戶的較低數字。

// Configure validation logic for passwords 
appUserManager.PasswordValidator = new PasswordValidator 
{ 
    RequiredLength = 3, 
    RequireNonLetterOrDigit = false, 
    RequireDigit = false, 
    RequireLowercase = false, 
    RequireUppercase = false, 
}; 

然而,當我輸入用戶和嘗試,並創建一個新的紀錄,我得到的IdentityResult驗證錯誤。

IdentityResult result = manager.Create(newUser, importedUser.Password); 

result.Errors = "Passwords must be at least 6 characters."

是沒可能覆蓋默認的身份要求?

這裏是整個ApplicationUserManager類以供參考:

public class ApplicationUserManager : UserManager<ApplicationUser> 
{ 
    public ApplicationUserManager(IUserStore<ApplicationUser> store) 
     : base(store) 
    { 
     PasswordValidator = new MinimumLengthValidator(3); 
    } 

    public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
    { 
     var appDbContext = context.Get<ApplicationDbContext>(); 
     var appUserManager = new ApplicationUserManager(new UserStore<ApplicationUser>(appDbContext)); 

     // Configure validation logic for usernames 
     appUserManager.UserValidator = new UserValidator<ApplicationUser>(appUserManager) 
     { 
      AllowOnlyAlphanumericUserNames = true, 
      RequireUniqueEmail = false 
     }; 

     // Configure validation logic for passwords 
     appUserManager.PasswordValidator = new PasswordValidator 
     { 
      RequiredLength = 3, 
      RequireNonLetterOrDigit = false, 
      RequireDigit = false, 
      RequireLowercase = false, 
      RequireUppercase = false, 
     }; 

     appUserManager.EmailService = new Services.EmailService(); 

     var dataProtectionProvider = options.DataProtectionProvider; 
     if (dataProtectionProvider != null) 
     { 
      appUserManager.UserTokenProvider = new DataProtectorTokenProvider<ApplicationUser>(dataProtectionProvider.Create("ASP.NET Identity")) 
      { 
       //Code for email confirmation and reset password life time 
       TokenLifespan = TimeSpan.FromHours(6) 
      }; 
     } 

     return appUserManager; 
    } 
} 
+0

我在我的項目中搜索了錯誤文本「密碼必須至少爲X個字符」,但根本找不到它。這使我相信它是Identity框架的內置需求。 – webworm

+0

你可以在'IdentityResult result = manager.Create(newUser,importedUser.Password)'之前顯示代碼嗎?你是怎麼得到'經理'對象的? – tmg

回答

0

檢查你的web.config文件,以確保它不會有它的最小密碼長度要求被別人覆蓋一切。

+0

感謝您的建議,但web.config中沒有任何與密碼相關的內容。 – webworm

1

我發現了這個問題。上面列出的ApplicationUserManager類是從API控制器調用的。不過,我試圖將用戶導入API之外的數據庫。所以我需要做的是將密碼驗證覆蓋在我導入用戶的方法中。具體來說,我在哪裏實例化了manager。這裏是一個例子:

foreach (var user in UserList) 
{ 
    var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())); 
    manager.PasswordValidator = new MinimumLengthValidator(3); 

    var roleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(new ApplicationDbContext())); 

    var newUser = new ApplicationUser() 
    { 
     UserName = user.UserName, 
     UserId = user.UserId, 
     Email = user.Email, 
     FirstName = user.FirstName, 
     LastName = user.LastName, 
    }; 


    // Assign the password 
    IdentityResult result = manager.Create(newUser, user.Password); 

    // Assign the role 
    var addedUser = manager.FindByName(user.UserName); 
    manager.AddToRoles(addedUser.Id, new string[] { "User" }); 

} 

注意行manager.PasswordValidator = new MinimumLengthValidator(3);。這裏是我定義密碼覆蓋的地方。之前,我在ApplicationUserManager課上設置了密碼覆蓋,認爲它將覆蓋創建的所有實例。解決方案是定義使用ApplicationUserManager類的密碼覆蓋。對不起,我自己的答案,但我想寫的解決方案,以防其他人遇到同樣的問題。