FormsAuthentication对象已废弃

我在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)’已过时:’建议的替代方法是使用Membership API,例如Membership.ValidateUser。 有关详细信息,请参阅http://go.microsoft.com/fwlink/?LinkId=252463 。

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

        

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

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

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

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

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

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

希望这清除它!

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

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

如果您不想走得那么远,这篇文章将展示如何在没有成员资格的情况下依赖内置的身份validation框架

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

这里有一些关于由Microsoft实施的OWIN安全中间件的背景信息。