我的任务是使用现有的数据库和身份验证,在MVC4中重写现有的Asp.Net Classic Web应用程序。
旧应用程序仍在其表中使用“aspnet_”前缀。我已经修改了新网站的web.config以包含这些提供程序(直接从旧网站复制)
<roleManager enabled="true">
<providers>
<remove name="AspNetSqlRoleProvider" />
<add connectionStringName="LocalSqlServer" applicationName="MyApp" name="AspNetSqlRoleProvider" type="System.Web.Security.SqlRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove name="AspNetWindowsTokenRoleProvider" />
<add applicationName="IOL" name="AspNetWindowsTokenRoleProvider" type="System.Web.Security.WindowsTokenRoleProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</roleManager>
<membership defaultProvider="AspNetSqlMembershipProvider">
<providers>
<remove name="AspNetSqlMembershipProvider" />
<add connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="true" applicationName="MyApp" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="AspNetSqlMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<remove name="AspNetAdminMembershipProvider" />
<add connectionStringName="LocalSqlServer" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" applicationName="IOL" requiresUniqueEmail="false" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" passwordStrengthRegularExpression="" name="AspNetAdminMembershipProvider" type="System.Web.Security.SqlMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
</providers>
</membership>
在我的帐户控制器的登录操作中:
public ActionResult Login(LoginModel model, string returnUrl)
{
var auth = Membership.ValidateUser(model.UserName, model.Password);
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
return RedirectToLocal(returnUrl);
}
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
return View(model);
}
如果我从控制器中删除[InitializeSimpleMembership],则auth变量为true,如果我将其添加回来,我会收到一条错误,指出“无法将类型'System.Guid'转换为'int'”。 Websecurity.Login()方法在有和没有class属性的情况下都失败了。
简而言之,如果我删除简单成员资格,表单auth验证用户是否有效,但是当我检查User.Identity.IsAuthenticated对象时,则表示为false。
我错过了什么?我甚至不确定我是否正确实现了这个安全模型,我找不到任何关于它的信息。
答案 0 :(得分:1)
您不能将旧会员提供者与SimpleMembership(例如WebSecurity)一起使用。您需要使用SimpleMembershipProvider。您必须将数据从旧表结构迁移到SimpleMembership使用的模式。您可以在SimpleMembership表中自定义的唯一内容是包含用户配置文件信息的表,您可以read about here。
迁移到MVC4和SimpleMembership已经让你落后于曲线。 SimpleMembership已针对ASP.NET Identity折旧。 ASP.NET Identity需要MVC5,您应该将其迁移到任何方面以利用所有added features以及保持基础组件最新的一般优势。 ASP.NET Identity比SimpleMembership更灵活(SimpleMembership设计简单且不够灵活)甚至还有一篇文章引导您完成migrating SQL Membership to ASP.NET Identity的步骤。