我在 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(字符串,字符串)'
已过时:'推荐的替代方案是使用会员资格
API,例如 Membership.ValidateUser。有关更多信息,请参阅http://go.microsoft.com/fwlink/?LinkId=252463 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 是所有安全系统的未来吗?还是我应该继续编写更适合客户需求的定制安全系统?