【问题标题】:Authentication without using Forms Authentication不使用表单身份验证的身份验证
【发布时间】:2012-07-13 15:06:06
【问题描述】:

我正在创建一个我希望用户注册的个人网站。我一直在查找需要采取的各种安全措施,并且很好奇我需要注意哪些主要事项。我决定不使用 ASP.NET Forms 身份验证,主要是为了自己创建身份验证过程的乐趣。这是我迄今为止所做的:

  • 我有一个 MySQL 数据库,用于存储用户的登录信息,例如密码和盐的哈希值
  • 登录后,设置一个与其用户名相同的会话——这让我想到了一个问题:这是在不使用表单身份验证的情况下跟踪登录用户的最佳方式吗?例如,设置会话是这样的:

    Session["User"] = username;

有没有更好的方法来跟踪登录用户?或者这是一种可以接受但仍然安全的处理方式?

【问题讨论】:

  • 您可能需要设置上下文的(自定义)主体。
  • 所以你是为了好玩而重新发明轮子?很公平,我也做过同样的事情。 Forms Authentication 的核心其实很简单,它用经过身份验证的用户信息存储了一个加密的烹饪。这整个过程,包括存储什么信息以及如何存储,都可以定制。使用 Session 状态本质上是在做同样的事情,只是用户信息存储在服务器上。我真的建议自定义 Forms Authentication 而不是从头开始。
  • 如果您甚至不能自己开始,那么您就没有编写自己的身份验证系统的业务,您将错误地实施它。至少实现内置系统并弄清楚它是如何工作的。
  • 我已经开始并且它几乎完成了......如果我不使用表单身份验证,我只是在寻找有关跟踪登录用户的最佳方法的建议。但感谢您的关注。
  • 确保会话密钥或 cookie,或者您实现它的方式是通过 HTTPS 传递的。

标签: c# asp.net security authentication


【解决方案1】:

在我看来,更好的方法是在加密的 cookie 中保存用户信息,这样您的服务器就不需要跟踪会话中的每个用户。而且它比会话更可靠。您可以做的是仅使用从 FormsAuthentication 创建安全身份验证 cookie 的机制,并使用您自己的授权。

public void OnLoginClick(object sender, EventArgs e)
{
   if(MySqlValidUser(username, pass)) // this is where you would check if user is valid
   {
      FormsAuthentication.SetAuthCookie(username, null);
      Response.Redirect("/");
   }
}

这样,如果您启用了表单身份验证,您可以轻松访问您的 asp.net 页面上的 User.Identity.Name 或 User.IsAuthenticated

<authentication mode="Forms" />

【讨论】:

  • 完美!我会在今天的某个时候尝试一下,看看我能做些什么。谢谢!
【解决方案2】:

有没有更好的方法来跟踪登录用户?

Microsoft 将表单身份验证设计为使用加密的 cookie,以及使用查询字符串的无 cookie 回退。所以他们显然认为这比使用Session 更好。

一个优点是,如果用户的 Session 丢失(超时,但如果在使用 InProc Session 时回收应用程序 - 这是默认设置),用户不会自动注销。

如果你真的想“自己动手”,我建议你考虑:

  1. 编写自定义 MembershipProvider,它将与 FormsAuthentication 基础架构一起使用,但使您能够了解有关实施细节的一些信息。

  2. 或者研究 FormsAuthentication 设计,并尝试复制其中的大部分(例如:您可能会忽略对无 cookie 身份验证的支持)。

【讨论】:

    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 2012-03-15
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多