FormsAuthentication对象已废弃[使用MVC5]

时间:2014-01-11 11:46:06

标签: c# forms-authentication dotnetopenauth asp.net-mvc-5 owin

我在MVC5网站上使用以下代码:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(LoginModel loginModel) {
    if (ModelState.IsValid) {
        var authenticated = FormsAuthentication.Authenticate(loginModel.UserName, loginModel.Password);
        if (authenticated) {
            FormsAuthentication.SetAuthCookie(loginModel.UserName, true);
            return RedirectToAction("AdminPanel");
        }
        ModelState.AddModelError("", "The username and password combination were incorrect");
    }
    return View(loginModel);
}

会引发以下警告:

  

System.Web.Security.FormsAuthentication.Authenticate(string,string)'   已过时:'建议的替代方案是使用会员资格   API,例如Membership.ValidateUser。有关更多信息,请参阅   http://go.microsoft.com/fwlink/?LinkId=252463“。

首先是免责声明 - 我是那些喜欢与事物保持同步的开发者之一,我更愿意完全避免在VS中发出警告。但是,在这个特定的实例中,我使用的是非常原始的身份验证,它直接来自web.config,如下所示:

<authentication mode="Forms">
    <forms loginUrl="~/account/login" timeout="2880" slidingExpiration="true" name=".ASPXFORMSAUTH">
        <credentials passwordFormat="SHA1">
            <user name="MyUserName" password="a-big-long-password-hash"/>
        </credentials>
    </forms>
</authentication>

这个项目绝对没有进一步的登录要求 - 使用数据库是过度的,并且不需要分布式登录;基本上,在web.config中存储细节是最理想的解决方案,每个应用程序可能只有一个用户。我无疑会从控制器(使用DI / IoC)中抽象出认证代码,但我仍然打算使用FormsAuthentication对象来验证web.config中的详细信息。

虽然我完全了​​解会员提供商,DotNetOpenAuth和新的(但非常可怕的)基于OWIN的身份验证模型,但上述代码绰绰有余。

第一个问题 - 为什么当这是一个完全有效的用例时,FormsAuthentication已经过时了?我知道FormsAuthentication是一个密封的黑盒子,难以测试,其背后的代码是特定于域的,但在这个特定的实例中(我想直接从web.config部分读取详细信息),似乎很疯狂编写会员提供者或自定义身份验证服务?

第二个问题 - 除非我遗漏了某些内容,否则新的OWIN模型用于分布式身份验证,不适用于基于角色的企业级安全系统。从我读过的很多博客文章,白皮书和SO帖子来看,它似乎仍然不完整。我的假设是对的吗? OWIN是所有安全系统的未来,还是应该继续编写更适合我客户需求的定制安全系统?

2 个答案:

答案 0 :(得分:6)

至于你的第一点,我们已经废弃了它,因为现代安全标准严重不足。它使用直接散列而不进行迭代,这意味着访问Web.config的任何人都可以轻松找出原始密码的内容。但是如果你愿意接受这些风险,你肯定可以继续使用它。只需使用原始代码禁止警告和解决方法。

至于你的第二点,这与OWIN之间没有任何关系。

希望这可以解决它!

答案 1 :(得分:6)

OWIN不只是关于安全性。它是定义应用程序框架(ASP.NET MVC)和Web服务器(IIS)之间接口的标准。它是Microsoft定义的一个新的抽象层,它允许.NET开发人员编写与主机无关的应用程序,即不依赖于IIS。

OWIN体系结构是一个由多个中间件组件组成的管道。在MVC5中,安全性已经从头开始重写为OWIN中间件组件。如果这对您不起作用并且您想要推出自己的密码验证例程,则可以实现自己的安全中间件。这是一个描述如何操作的post

如果你不想走得那么远,这个post展示了如何在没有会员资格的情况下依赖内置的身份验证框架

Levi提到的一切仍然有效。您需要小心自己的散列/存储机制并选择一个良好的散列算法。

这里有一些关于Microsoft实施的OWIN安全性midddleware的背景信息。

相关问题