zoukankan      html  css  js  c++  java
  • Membership强制重置密码(备忘)_20101016

    前言:

    使用Membership时,涉及密码的操作,一般有:

    (1)修改密码:已知旧密码,使用ChangePassword进行;

    (2)获得随机密码:使用ResetPassword进行;

    (3)修改问题和答案:已知旧密码,使用ChangePasswordQuestionAndAnswer进行;

    有时候,客户忘记旧密码,需要强行重置密码。

    涉及的关键代码段为:

    代码
      #region 强制重置密码

      
    //强制重新设置密码
      protected void btn_ForceResetPwd_Click(object sender, EventArgs e)
      {
        
    try
        {
          
    string connStr = WebConfigurationManager.ConnectionStrings["MemberShipSqlConnection"].ToString();
          
    string username = lblUserName.Text.Trim();

          
    string strPswFormat = "Clear";      //默认值
          
    //==从WebConfig中获取Membership的Format==
          MembershipSection m = (MembershipSection)ConfigurationManager.GetSection("system.web/membership");
          ProviderSettings p 
    = m.Providers[m.DefaultProvider];
          NameValueCollection nv 
    = p.Parameters;
          
    if (nv == null || p.Parameters.Count == 0 || string.IsNullOrEmpty(nv["passwordFormat"]))
          {
            strPswFormat 
    = "Clear";
          }
          
    else
          {
            strPswFormat 
    = nv["passwordFormat"];
          }

          
    //=== 产生加密用的密码密钥 ===  
          string salt = GenerateSalt();

          
    //=== 将明码密码加密(此时密码为"@Pssw0rd" 当然也可随机数生成) ===  
          string password = EncryptToHashString(txt_ForceNewPassword.Text, salt, "SHA1");
          
    if (strPswFormat.Equals("Clear"))
          {
            password 
    = txt_ForceNewPassword.Text;
          }

          SqlConnection conn 
    = new SqlConnection(connStr);
          conn.Open();

          
    //=== 在此我们呼叫 Membership 提供者 数据库里的预存程序来重置密码 ===  
          SqlCommand cmd = new SqlCommand("aspnet_Membership_SetPassword", conn);
          cmd.CommandType 
    = CommandType.StoredProcedure;

          
    //=== 目前使用 Membership 提供者的 web 应用程序名称 ===  
          cmd.Parameters.Add(new SqlParameter("@ApplicationName", Membership.ApplicationName));

          
    //=== 要重置密码的用户账号 ===  
          cmd.Parameters.Add(new SqlParameter("@UserName", username));

          
    //=== 加密过的密码 ===  
          cmd.Parameters.Add(new SqlParameter("@NewPassword", password));

          
    //=== 密码加密密钥(一定和使用加密密码的密钥一样,不要再重新产生) ===  
          cmd.Parameters.Add(new SqlParameter("@PasswordSalt", salt));

          
    //=== 重置密码的时间 ===  
          cmd.Parameters.Add(new SqlParameter("@CurrentTimeUtc", DateTime.Now));

          
    //=== 密码加密的格式(此时是Hash1,注意传入参数是int型态。) ===  
          if (strPswFormat.Equals("Clear"))
          {
            cmd.Parameters.Add(
    new SqlParameter("@PasswordFormat"""));
          }
          
    else
          {
            cmd.Parameters.Add(
    new SqlParameter("@PasswordFormat", Membership.Provider.PasswordFormat.GetHashCode()));
          }

          
    //=== 宣告一个可以接收回传值得参数 ===  
          SqlParameter returnValue = new SqlParameter();
          returnValue.ParameterName 
    = "returnValue";
          returnValue.Direction 
    = ParameterDirection.ReturnValue;
          cmd.Parameters.Add(returnValue);

          
    //=== 执行预存程序 ===  
          cmd.ExecuteNonQuery();
          conn.Close();

          
    //=== 检查重置密码是否成功 ===  
          if (returnValue.Value.ToString() == "0")
            lbl_Tips.Text 
    = "重置密码成功!!";
          
    else
            lbl_Tips.Text 
    = "重置密码失败!!";

        }
        
    catch (Exception ex)
        {
          
    throw ex;
        }
        
    finally
        {
          
    string userName = Request.QueryString["UserName"];
          
    if (!String.IsNullOrEmpty(userName))
          {
            SetUserDetail(userName);
          }
        }
      }

      
    /// <summary>  
      
    /// 密码加密钥  
      
    /// </summary>  
      
    /// <returns></returns>  
      public string GenerateSalt()
      {
        
    byte[] data = new byte[0x10];
        
    new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(data);
        
    return Convert.ToBase64String(data);
      }

      
    /// <summary>  
      
    /// 哈希密码加密(不可还原)  
      
    /// </summary>  
      
    /// <param name="s">原始字符串</param>  
      
    /// <param name="saltKey">Salt加密字符串</param>  
      
    /// <param name="hashName">加密格式(MD5, SHA1, SHA256, SHA384, SHA512.)</param>  
      
    /// <returns>加密过的密码</returns>  
      public string EncryptToHashString(string s, string saltKey, string hashName)
      {
        
    byte[] src = System.Text.Encoding.Unicode.GetBytes(s);
        
    byte[] saltbuf = Convert.FromBase64String(saltKey);
        
    byte[] dst = new byte[saltbuf.Length + src.Length];
        
    byte[] inArray = null;
        System.Buffer.BlockCopy(saltbuf, 
    0, dst, 0, saltbuf.Length);
        System.Buffer.BlockCopy(src, 
    0, dst, saltbuf.Length, src.Length);

        System.Security.Cryptography.HashAlgorithm algorithm 
    = System.Security.Cryptography.HashAlgorithm.Create(hashName);
        inArray 
    = algorithm.ComputeHash(dst);

        
    return Convert.ToBase64String(inArray);
      }
            
      
    #endregion

     其中Webconfig中的配置为:

    代码
        <membership defaultProvider="MembershipProvider" userIsOnlineTimeWindow="15">
          
    <providers>
            
    <clear/>
            
    <add name="MembershipProvider" type="System.Web.Security.SqlMembershipProvider" connectionStringName="MemberShipSqlConnection" applicationName="LivePortal" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" passwordFormat="Clear" minRequiredPasswordLength="1" minRequiredNonalphanumericCharacters="0" maxInvalidPasswordAttempts="20" passwordAttemptWindow="10"/>
          
    </providers>
        
    </membership>
  • 相关阅读:
    Linux安装ElasticSearch,Elasticsearch安装辅助插件,IK分词器安装,使用IK分词器
    springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署
    dubbo:分布式系统中的相关概念,服务提供者,服务消费者,dubbo高级特性
    Maven高级:分模块开发与设计,聚合,集成,属性,版本管理,多环境开发配置和跳过测试,私服搭建
    springMVC:校验框架:多规则校验,嵌套校验,分组校验;ssm整合技术
    springMVC:异步调用,异步请求跨域访问,拦截器,异常处理,实用技术
    Web全段重点整理
    spring事务:事务控制方式,使用AOP控制事务,七种事务传播行为,声明事务,模板对象,模板对象原理分析
    Java基础技术基础面试【笔记】
    高级知识点:多线程,资源管理【笔记】
  • 原文地址:https://www.cnblogs.com/lybohe0807/p/1853153.html
Copyright © 2011-2022 走看看