是否可以在没有标准类和名称空间的情况下创建自己的身份验证

时间:2012-03-28 12:37:01

标签: c# asp.net-mvc authentication membership-provider

我创建了空白的Asp.Net-MVC 3 Web应用程序,并希望编写自己非常简单的身份验证。创建了一个数据库,其中将存储有关用户的所有信息。创建一个控制器,使用文本框查看登录名和密码。 所以现在用户打开我的网站,输入他的登录名和密码,这些信息在服务器上接收并处理(通过我自己的ValidateUser方法)。我应该在哪里存储有关此用户的信息以供进一步使用?

如果您不理解我想要的内容,那么问题是:我可以在不使用标准MembershipRoles和MembershipProviders的情况下实现自己的身份验证过程吗?

4 个答案:

答案 0 :(得分:1)

在您向POST表单发布的控制器操作中,您可以针对您的数据库验证凭据,如果成功发出了一个包含当前连接用户的用户名的身份验证cookie,以便您可以在后续操作中检索它。

例如,假设您的表单包含发布到LogOn方法的用户名和密码字段:

[HttpPost]
public ActionResult LogOn(string username, string password)
{
    // TODO: up to you to implement the VerifyCredentials method
    if (!VerifyCredentials(username, password))
    {
        // wrong username or password:
        ModelState.AddModelError("", "wrong username or password");
        return View();
    }

    // username and password match => emit an authentication cookie:
    FormsAuthentication.SetAuthCookie(username, false);

    // and redirect to some controller action which is protected by the
    // [Authorize] attribute and which should be accessible only to 
    // authenticated users
    return RedirectToAction("SomeProtectedAction", "SomeController");
}

并且在受保护的操作中,您可以从Cookie中获取当前连接的用户名,如下所示:

[Authorize]
public ActionResult SomeProtectedAction()
{
    string username = User.Identity.Name;

    // TODO: here you could query your database to find out more about 
    // the user given his username which must be unique
    ...
}

答案 1 :(得分:1)

当然你可以 - 你的问题的第一部分的答案是'它取决于'。这取决于您希望如何/何时使用它。

内置身份验证将令牌存储在用于重新身份验证的Cookie中。

作为一个警告 - 你需要一个很好的理由自己实现这个 - 很容易弄错,并在你的网站上留下漏洞。

答案 2 :(得分:1)

您可以编写自己的自定义MemberShipProvider并调用自己的ValidateUser方法。

选中此Implementing a Membership Provider

如果你这样做,那么你可以使用

这样的优势
  1. 如果未通过在配置文件中设置进行身份验证,则重定向到登录页面
  2. 登录后,您可以使用返回网址重定向回用户所在的同一页面。

答案 3 :(得分:0)

是的,完全有可能(我们不在此处使用表格身份验证)。

但;您需要对所有负全部责任,包括:

  • 验证
  • 安全地存储/处理针对用户的某些令牌(通常是仅限http的cookie)
  • 令牌/用户对资源的验证
  • 令牌无效(要么是重播,要么是注销)
  • 所有缓存都涉及到
  • 任何出错的地方(包括但不限于错误的实施都会导致严重的安全失败)完全您的错误

当然是非常容易实现的,但需要有充分的理由,并且要小心。

?admin=true出了什么问题,是吗?)