AspNetCore(netcoreapp1.0)中是否有System.Web.Security.Membership.GeneratePassword的替代方案.

最简单的方法是只使用Guid.NewGuid().ToString("n"),它足够长,值得一个密码,但它不是完全随机的.

推荐答案

下面是一个类/方法,基于Membership.GeneratePassword个可用的源代码.净核心:

public static class Password
{
    private static readonly char[] Punctuations = "!@#$%^&*()_-+=[{]};:>|./?".ToCharArray();

    public static string Generate(int length, int numberOfNonAlphanumericCharacters)
    {
        if (length < 1 || length > 128)
        {
            throw new ArgumentException(nameof(length));
        }

        if (numberOfNonAlphanumericCharacters > length || numberOfNonAlphanumericCharacters < 0)
        {
            throw new ArgumentException(nameof(numberOfNonAlphanumericCharacters));
        }

        using (var rng = RandomNumberGenerator.Create())
        {
            var byteBuffer = new byte[length];

            rng.GetBytes(byteBuffer);

            var count = 0;
            var characterBuffer = new char[length];

            for (var iter = 0; iter < length; iter++)
            {
                var i = byteBuffer[iter] % 87;

                if (i < 10)
                {
                    characterBuffer[iter] = (char)('0' + i);
                }
                else if (i < 36)
                {
                    characterBuffer[iter] = (char)('A' + i - 10);
                }
                else if (i < 62)
                {
                    characterBuffer[iter] = (char)('a' + i - 36);
                }
                else
                {
                    characterBuffer[iter] = Punctuations[i - 62];
                    count++;
                }
            }

            if (count >= numberOfNonAlphanumericCharacters)
            {
                return new string(characterBuffer);
            }

            int j;
            var rand = new Random();

            for (j = 0; j < numberOfNonAlphanumericCharacters - count; j++)
            {
                int k;
                do
                {
                    k = rand.Next(0, length);
                }
                while (!char.IsLetterOrDigit(characterBuffer[k]));

                characterBuffer[k] = Punctuations[rand.Next(0, Punctuations.Length)];
            }

            return new string(characterBuffer);
        }
    }
}

我省略了CrossSiteScriptingValidation.IsDangerousString上的do...while圈.如果你需要的话,你可以把它加回go .

你这样使用它:

var password = Password.Generate(32, 12);

此外,请确保引用System.Security.Cryptography.算法rithms.

Asp.net相关问答推荐

ASP.NET MVC项目中的产品采购并发性测试

IIS重写模块排除机器人但允许GoogleBot

使用 Asp.Net MVC 和 KnockoutJS 处理日期

在 ASP.NET 中访问没有值的查询字符串参数

在 DataTextField 中组合两个字段.这可能吗?

业务逻辑中的实体框架最佳实践?

静态字段与会话变量

Automapper - 映射器已初始化错误

如何在 ASP.NET Web API 中使用非线程安全的 async/await API 和模式?

Twitter bootstrap glyphicons 不会出现在发布模式 404 中

HTTP 错误 401.3 - 未经授权

嵌套剃刀模板中的@RenderSection

如何找出我的 Windows 域上托管 LDAP 的服务器?

设置 Response.Status 生成HTTP 状态字符串无效异常

Twitter Bootstrap 和 ASP.NET GridView

ASP.NET 5、EF 7 和 SQLite - SQLite 错误 1:没有这样的表:博客

回发后运行javascript函数

如何在 asp.net 中实现Access-Control-Allow-Origin标头

服务器标签格式不正确错误

DataTable 不包含 AsEnumerable 的定义