Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否可以在没有标准类和名称空间的情况下创建自己的身份验证?_C#_Asp.net Mvc_Authentication_Membership Provider - Fatal编程技术网

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

C# 是否可以在没有标准类和名称空间的情况下创建自己的身份验证?,c#,asp.net-mvc,authentication,membership-provider,C#,Asp.net Mvc,Authentication,Membership Provider,我已经创建了一个空白的Asp.Net-MVC3Web应用程序,并想编写自己的非常简单的身份验证。创建了一个数据库,用于存储有关用户的所有信息。创建了一个控制器,视图中包含用于登录和密码的文本框。 所以现在用户打开我的站点,输入他的登录名和密码,这个信息在服务器上接收并处理(通过我自己的ValidateUser方法)。我应该在哪里存储有关此用户的信息以供进一步使用 如果您不明白我想要什么,那么问题是:我是否可以在不使用标准成员身份角色和成员身份提供程序的情况下实现自己的身份验证过程?在您发布登录表

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


如果您不明白我想要什么,那么问题是:我是否可以在不使用标准成员身份角色和成员身份提供程序的情况下实现自己的身份验证过程?

在您发布登录表单的控制器操作中,您可以根据数据库验证凭据,如果成功,则会发出一个身份验证cookie将包含当前连接用户的用户名,以便您可以在后续操作中检索该用户名

例如,假设您有一个包含用户名和密码字段的表单,该表单正在发布到登录方法:

[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
    ...
}

当然你可以,而你问题的第一部分的答案是“视情况而定”。这取决于你想如何/何时使用它

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


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

你可以编写自己的自定义成员资格提供程序并调用自己的ValidateUser方法

检查这个

如果你这样做,那么你可以利用以下优势

  • 如果未通过配置文件中的设置进行身份验证,则重定向到登录页面
  • 登录后,您可以使用返回url重定向回用户所在的页面

  • 是的,这是完全可能的(我们这里不使用forms auth)

    但是;你需要对一切负全部责任,包括:

    • 认证
    • 针对用户安全地存储/处理某些令牌(通常是仅http的cookie)
    • 根据资源验证令牌/用户
    • 使令牌无效(防止重播或注销)
    • 这其中涉及的所有缓存
    • 任何出错(包括但不限于,一个糟糕的实现暴露了一个严重的安全失败)都是你的错
    当然,这是可以实现的,但这需要有充分的理由和谨慎


    (我不知道如何操作cookies,但是如果你能给我一些关键字甚至链接,我会很高兴的it@steavy,要发出身份验证cookie,可以使用
    FormsAuthentication.SetAuthCookie(用户名,false)其中username是经过身份验证的用户的用户名。我建议您阅读更多有关MSDN上表单身份验证的信息,以更好地了解其工作原理:您肯定应该将自定义解决方案与表单身份验证位集成。如果你真的想让你的手沾满鲜血,那么写一个定制的会员资格提供者能解决你的问题吗?谷歌“实现会员资格提供商”你甚至不需要这样做。您可以编写一些更加定制的内容,并在验证用户后发出一张票据。成员资格/角色提供程序与依赖项注入不太兼容。推荐使用。在我看来,使用成员资格/角色提供程序的最大好处是,它们是现成的,并且有很好的文档记录。如果您的工作是基于经过多次版本改进的组件和文档,那么就不太可能出现严重的安全错误。即使您对自己的安全知识/技能很有信心,但将自己的安全性从头开始是一件危险的事情。@不屑一顾将安全风险留给dotnet框架,而不是由我们自己来处理。你们是对的,我在Spring.Net中使用DI时也遇到了问题,但在会员资格提供商的其他好处上有所妥协。