【问题标题】:Custom vs. Built-In Authentication in ASP.NET Web Forms and MVC [closed]ASP.NET Web 窗体和 MVC 中的自定义与内置身份验证 [关闭]
【发布时间】:2020-03-02 03:01:52
【问题描述】:

我将构建两个 Web 应用程序,一个在 MVC 中,另一个在 Web 窗体中。我对是否应该使用 ASP.NET 和 MVC 中可用的内置身份验证系统,或者是否应该创建自己的自定义身份验证系统感到困惑。比如用加密密码存储创建我自己的AccountController等。

我需要知道的是使用内置身份验证是否更有意义。如果没有,那么在为此创建自己的Controller 时,我需要考虑哪些事情,例如加密密码等?

【问题讨论】:

  • 这是一个很棒的话题,但它不是一个好的 SO 问题。
  • 你能告诉我为什么这不是一个好问题吗?其实我需要知道这一点。如果你告诉我,我会很感激的
  • SO 是针对具体实施的具体问题。不适用于讨论最佳实践或建议。尽管您可能偶尔会在此处找到类似的问题,但大多数都是较老的问题,现在不鼓励提出这些问题。关键是,您可能会得到答案,但您也可能会被否决并关闭您的问题。查看帮助中心了解更多信息。
  • 也就是说,请查看这个 SO 问题,了解有关在 MVC 中构建自定义成员资格的一些非常棒的链接。我使用这些链接为我去年构建的 MVC 网站构建了自定义用户和会员管理系统:stackoverflow.com/questions/14872202/…
  • 其实我很想知道如果我们使用内置的身份验证是否是好的方法

标签: asp.net asp.net-mvc asp.net-mvc-4 webforms asp.net-authentication


【解决方案1】:

您可以在 MVC 和 WebForm 中使用 ASP.NET Identity 2,但学习曲线陡峭。

您可以免费阅读ASP.NET identity from Adam Freeman's book

如果你觉得 ASP.NET Identity 2 太多,可以使用FormAuthentiation

仅供参考:我强烈建议不要实现自己的加密算法。创建加密算法需要大量技能和测试。

ASP.NET Universal Providers使用的密码哈希算法

private static string GenerateSalt()
{
    byte[] numArray = new byte[16];
    (new RNGCryptoServiceProvider()).GetBytes(numArray);
    string base64String = Convert.ToBase64String(numArray);
    return base64String;
}

private string EncodePassword(string pass, int passwordFormat, string salt)
{
    byte[] numArray;
    byte[] numArray1;
    string base64String;
    bool length = passwordFormat != 0;
    if (length)
    {
        byte[] bytes = Encoding.Unicode.GetBytes(pass);
        byte[] numArray2 = Convert.FromBase64String(salt);
        byte[] numArray3 = null;

        HashAlgorithm hashAlgorithm = HashAlgorithm.Create("SHA1");

        if (hashAlgorithm as KeyedHashAlgorithm == null)
        {
            numArray1 = new byte[(int) numArray2.Length + (int) bytes.Length];
            Buffer.BlockCopy(numArray2, 0, numArray1, 0, (int) numArray2.Length);
            Buffer.BlockCopy(bytes, 0, numArray1, (int) numArray2.Length, (int) bytes.Length);
            numArray3 = hashAlgorithm.ComputeHash(numArray1);
        }
        else
        {
            KeyedHashAlgorithm keyedHashAlgorithm = (KeyedHashAlgorithm) hashAlgorithm;
            if (keyedHashAlgorithm.Key.Length != numArray2.Length)
            {

                if (keyedHashAlgorithm.Key.Length >= (int) numArray2.Length)
                {
                    numArray = new byte[(int) keyedHashAlgorithm.Key.Length];
                    int num = 0;
                    while (true)
                    {
                        length = num < (int) numArray.Length;
                        if (!length)
                        {
                            break;
                        }
                        int num1 = Math.Min((int) numArray2.Length, (int) numArray.Length - num);
                        Buffer.BlockCopy(numArray2, 0, numArray, num, num1);
                        num = num + num1;
                    }
                    keyedHashAlgorithm.Key = numArray;
                }
                else
                {
                    numArray = new byte[(int) keyedHashAlgorithm.Key.Length];
                    Buffer.BlockCopy(numArray2, 0, numArray, 0, (int) numArray.Length);
                    keyedHashAlgorithm.Key = numArray;
                }
            }
            else
            {
                keyedHashAlgorithm.Key = numArray2;
            }
            numArray3 = keyedHashAlgorithm.ComputeHash(bytes);
        }

        base64String = Convert.ToBase64String(numArray3);
    }
    else
    {
        base64String = pass;
    }
    return base64String;
}

【讨论】:

  • 所以你的意思是推荐mvc提供的内置身份验证。
  • VS2013中的MVC和WebForm都带有ASP.NET Identity 2。
  • 其实我很想知道如果我们使用内置的身份验证是否是好的方法。如果我们用 32 位或 64 位加密的注册和登录模块制作自己的帐户控制器,用于存储或检索密码或重要数据,你怎么看
  • 我个人不喜欢加密密码。相反,我喜欢更安全的散列密码(单向加密)。我上传了哈希密码算法。
【解决方案2】:

@Heemanshu Bhalla:因为这最终是一个设计问题,所以没有正确答案;这将取决于您的确切要求。不过,您应该问自己一些问题:

  • 您是否需要支持第三方身份验证(例如,通过 OAuth,如 Facebook 或 Twitter)?
  • 您是否需要提供双重身份验证(例如短信或电子邮件验证)?
  • 这将与实体框架应用程序集成吗?
  • 您将来是否需要向外部客户端(例如移动设备)提供身份验证?

正如@Win 所说,我绝对会避免编写自己的身份验证或加密系统。也就是说,如果上述任何问题的答案是“是”,那么我会强烈考虑内置的ASP.NET Identity 2。是的,正如@Win 所说,这是一个陡峭的学习曲线,但是:

  • 您可以使用 Visual Studio 项目模板构建基本设置。
  • 它将为您以后需要更高级的功能奠定坚实的基础。
  • 传统的基于表单的身份验证虽然易于学习,但实际上已被弃用。

如果您对开箱即用的基本功能感到满意,并且不介意项目中有大量预先搭建的代码,那么了解 Visual Studio 项目模板的要点并不难。也就是说,他们绝对需要耐心和承诺才能完全理解,特别是提供更深入的定制。

【讨论】:

    猜你喜欢
    • 2013-04-14
    • 2014-05-21
    • 2013-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    • 1970-01-01
    • 2016-05-06
    相关资源
    最近更新 更多