【问题标题】:Loop through membership list and get users循环访问会员列表并获取用户
【发布时间】:2020-12-10 04:05:55
【问题描述】:

我正在尝试通过获取 10 个最近创建或具有特定字符的特定用户来测试我的代码。我的代码基于这个。此代码来自 Dan。 Changing passwordFormat from Encrypted to Hashed

void HashAllPasswords()
    {
        var clearProvider = Membership.Providers["SqlProvider_Clear"];
        var hashedProvider = Membership.Providers["SqlProvider_Hashed"];
        int dontCare = 2;
        if (clearProvider == null || hashedProvider == null) return;
                        var passwords = encrypted.GetAllUsers(0, int.MaxValue, out dontCare)
        .Cast<MembershipUser>().Where(u => u.IsLockedOut == false && u.IsApproved == true).OrderByDescending(u => u.CreationDate).ToDictionary(u => u.UserName, u => u.GetPassword());
    
        using (var conn = new SqlConnection(
               ConfigurationManager.ConnectionStrings[0].ConnectionString))
        {
            conn.Open();
            using (var cmd = new SqlCommand(
                   "UPDATE [aspnet_Membership] SET [PasswordFormat]=1", conn))
                cmd.ExecuteNonQuery();
        }
    var count = 0;
        foreach (var entry in passwords)
        {
            var resetPassword = hashedProvider.ResetPassword(entry.Key, null);
            hashedProvider.ChangePassword(entry.Key, resetPassword, entry.Value);
            count++;
        if (count == 2)
            break;
        }
    }

因此,基本上我不想更改所有用户,而是只想更改 10 个用户或 100 个用户,具体取决于我想要的数量。我也收到了一个错误

变量记录

它说

错误是

项目已添加。输入字典:'sample@email.com' 正在添加的密钥:'sample@email.com'。

有没有办法解决这个问题?也许我以错误的方式使用 linq。

【问题讨论】:

  • 重要的是哪些用户或只是一些用户。是否还需要能够以字母开头(例如 i 和那么多用户)?
  • @IsaacMorris 有点类似于 sql 中的“like”。例如,只想获取名称中有“测试”的用户。或者在我循环他们并更改密码之前是否可以只获得固定数量的用户。约束基本上是如果它花费太长时间并且发生执行超时,因为它会获取所有数据。

标签: c# asp.net asp.net-membership


【解决方案1】:

我认为问题是因为您的数据库中有相同的用户名导致Dictionary 不能有相同的密钥,所以创建使用List。先创建一个User类,把数据放进去。

关于数据过多导致SQL超时需要更新GetAllUsers()中的SQL查询

关于SQLlike可以使用Contains

关于你可以使用的计数Take()

   public class User
        {
            public string UserName { get; set; }
            public string Password { get; set; }
        }

                var passwords = encrypted.GetAllUsers(0, int.MaxValue, out dontCare)
                    .Cast<MembershipUser>()
                    .Where(u => u.IsLockedOut == false && u.IsApproved == true)
                    .OrderByDescending(u => u.CreationDate)
                    .Select(x => new User
                    {
                        UserName = x.UserName,
                        Password = x.GetPassword()
                    });


                //someting like SQL likie
                passwords.Where(user => user.UserName.Contains("Test")).ToList().ForEach(
                    x =>
                    {
                        //reset passwrod
                    });

                // get count
                passwords.Take(10).ToList().ForEach(
                    x =>
                    {
                        //reset passwrod
                    });

【讨论】:

  • 你好 Michaelmao。感谢您的答复。我尝试了上面的代码,但我遇到了连接超时。我的表中有 300k+ 数据。我尝试输入“连接超时 = 0 或 9000”来扩展它,但它仍然是一样的。你知道这是什么原因造成的吗?有没有办法解决这个问题?
  • 更改encrypted.GetAllUsers不要在一次查询中获得一些数据或增加超时时间
猜你喜欢
  • 2012-08-07
  • 2021-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-13
  • 1970-01-01
相关资源
最近更新 更多