133 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
	
using System.Globalization;
 | 
						||
using System.Text.RegularExpressions;
 | 
						||
 | 
						||
namespace IRaCIS.Core.Application.Helper;
 | 
						||
 | 
						||
public static class IRCEmailPasswordHelper
 | 
						||
{
 | 
						||
    private static readonly Random Random = new Random();
 | 
						||
 | 
						||
    //显示位数:3分之2的位数,向上取整
 | 
						||
    //取哪几个个值:最后一位和前面几位
 | 
						||
    //其他:3个***。
 | 
						||
    //比如:hlj23@126.com
 | 
						||
    //为:hlj***3@126.com
 | 
						||
 | 
						||
    //he@126.com
 | 
						||
    //为:h*** e@126.com
 | 
						||
 | 
						||
    public static string MaskEmail(string email)
 | 
						||
    {
 | 
						||
 | 
						||
        // 找到 "@" 符号的位置
 | 
						||
        int atIndex = email.IndexOf('@');
 | 
						||
 | 
						||
        string visiblePartBefore = email.Substring(0, atIndex);
 | 
						||
 | 
						||
        string afterAt = email.Substring(atIndex + 1);
 | 
						||
 | 
						||
        int visibleLength = (int)Math.Ceiling((double)visiblePartBefore.Length * 2 / 3);
 | 
						||
 | 
						||
        // 替换中间两位字符为星号
 | 
						||
        string hiddenPartBeforeAt = visiblePartBefore.Substring(0, visibleLength - 1) + "***" + visiblePartBefore.Last();
 | 
						||
 | 
						||
 | 
						||
        // 组合隐藏和可见部分
 | 
						||
        string hiddenEmail = hiddenPartBeforeAt + "@" + afterAt;
 | 
						||
 | 
						||
        return hiddenEmail;
 | 
						||
    }
 | 
						||
 | 
						||
    /// <summary>
 | 
						||
    /// 密码必须包含:1)8 – 32 个字符;2)至少1个数字;3) 至少1个大写字母;4)至少1个小写字母;5)至少1个特殊字符 (~!-@#$%^&*_+?)
 | 
						||
    /// </summary>
 | 
						||
    /// <returns></returns>
 | 
						||
    public static string GenerateRandomPassword(int length)
 | 
						||
    {
 | 
						||
        // 必须包含的字符组
 | 
						||
        const string numbers = "0123456789";
 | 
						||
        const string upperCaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
 | 
						||
        const string lowerCaseLetters = "abcdefghijklmnopqrstuvwxyz";
 | 
						||
        const string specialCharacters = "~!-@#$%^&*_+?";
 | 
						||
 | 
						||
        // 随机选择至少一个字符
 | 
						||
        char[] requiredCharacters =
 | 
						||
        {
 | 
						||
        numbers[Random.Next(numbers.Length)],
 | 
						||
        upperCaseLetters[Random.Next(upperCaseLetters.Length)],
 | 
						||
        lowerCaseLetters[Random.Next(lowerCaseLetters.Length)],
 | 
						||
        specialCharacters[Random.Next(specialCharacters.Length)]
 | 
						||
        };
 | 
						||
 | 
						||
        // 构建剩余的字符集,用于填充密码的其余部分
 | 
						||
        string allCharacters = numbers + upperCaseLetters + lowerCaseLetters + specialCharacters;
 | 
						||
 | 
						||
        // 确保密码长度满足用户要求
 | 
						||
        char[] password = new char[length];
 | 
						||
 | 
						||
        // 将必须包含的字符放入密码中
 | 
						||
        requiredCharacters.CopyTo(password, 0);
 | 
						||
 | 
						||
        // 填充剩余的字符
 | 
						||
        for (int i = requiredCharacters.Length; i < length; i++)
 | 
						||
        {
 | 
						||
            password[i] = allCharacters[Random.Next(allCharacters.Length)];
 | 
						||
        }
 | 
						||
 | 
						||
        // 随机打乱密码字符顺序
 | 
						||
        return new string(password.OrderBy(_ => Random.Next()).ToArray());
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
 | 
						||
    // https://learn.microsoft.com/zh-cn/dotnet/standard/base-types/how-to-verify-that-strings-are-in-valid-email-format
 | 
						||
    /// <summary>
 | 
						||
    /// 微软官方邮件验证  很宽松
 | 
						||
    /// </summary>
 | 
						||
    /// <param name="email"></param>
 | 
						||
    /// <returns></returns>
 | 
						||
    public static bool IsValidEmail(string email)
 | 
						||
    {
 | 
						||
        if (string.IsNullOrWhiteSpace(email))
 | 
						||
            return false;
 | 
						||
 | 
						||
        try
 | 
						||
        {
 | 
						||
            // Normalize the domain
 | 
						||
            email = Regex.Replace(email, @"(@)(.+)$", DomainMapper,
 | 
						||
                                  RegexOptions.None, TimeSpan.FromMilliseconds(200));
 | 
						||
 | 
						||
            // Examines the domain part of the email and normalizes it.
 | 
						||
            string DomainMapper(Match match)
 | 
						||
            {
 | 
						||
                // Use IdnMapping class to convert Unicode domain names.
 | 
						||
                var idn = new IdnMapping();
 | 
						||
 | 
						||
                // Pull out and process domain name (throws ArgumentException on invalid)
 | 
						||
                string domainName = idn.GetAscii(match.Groups[2].Value);
 | 
						||
 | 
						||
                return match.Groups[1].Value + domainName;
 | 
						||
            }
 | 
						||
        }
 | 
						||
        catch (RegexMatchTimeoutException e)
 | 
						||
        {
 | 
						||
            return false;
 | 
						||
        }
 | 
						||
        catch (ArgumentException e)
 | 
						||
        {
 | 
						||
            return false;
 | 
						||
        }
 | 
						||
 | 
						||
        try
 | 
						||
        {
 | 
						||
            return Regex.IsMatch(email,
 | 
						||
                @"^[^@\s]+@[^@\s]+\.[^@\s]+$",
 | 
						||
                RegexOptions.IgnoreCase, TimeSpan.FromMilliseconds(250));
 | 
						||
        }
 | 
						||
        catch (RegexMatchTimeoutException)
 | 
						||
        {
 | 
						||
            return false;
 | 
						||
        }
 | 
						||
    }
 | 
						||
}
 |