1

只是想知道在 mvc3 中处理登录/用户身份验证的最佳实践是什么。最好使用内置的成员资格,例如:

    [HttpPost]
    public ActionResult Register(RegisterUser model)
    {
        if (ModelState.IsValid)
        {
            // Attempt to register the user
            MembershipCreateStatus createStatus;
            Membership.CreateUser(model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

            if (createStatus == MembershipCreateStatus.Success)
            {
                FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);
                return RedirectToAction("Index","User");
            }
            else
            {
                ModelState.AddModelError("", ErrorCodeToString(createStatus));
            }
        }

        return View(model);
    }

或者更简单和自定义的东西,例如制作自己的 cookie 以避免每次都使用预打包的数据库结构?

FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
    1,
    user.UserName,
    DateTime.Now,
    DateTime.Now.AddMinutes(10),
    false,
    null);

string encryptedTicket = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);

this.Response.Cookies.Add(cookie);
4

3 回答 3

3

我个人同意 Stack Overflow 提供两种直接通过 Stack Exchange 和 OpenId / OAuth 访问进行注册的方法;谷歌、雅虎、脸书、推特等。

在提供您自己的注册时,我会坚持使用 ASP.NET Membership 提供程序或通过NuGet提供的类似提供程序。

在使用 OpenId 和 OAuth 时,我在DotNetOpenAuth方面取得了巨大成功。请参阅 Andrew Arnott 的详细回答使用 OpenId 的好处和理由:To OpenID or not to OpenID?这值得么?

于 2012-06-14T04:03:03.867 回答
2

ASP.NET 成员资格的存在是有原因的。

如果它像设置 cookie 一样简单,LinkedIn 黑客就不会知道我的密码。


除非您真的知道自己在做什么,否则不要编写自己的会员提供程序。

于 2012-06-14T03:57:38.193 回答
1

我建议您最好的选择是提供自定义提供程序,这样您就不必使用“预打包”数据库。通过这种方式,您可以重复使用内置的身份验证和授权内容,同时仍然拥有自定义的用户数据库。

这并不难,只需创建一个派生自MembershipProviderRoleProvider如果您想包含角色)的类。这些是抽象类,因此您需要提供各种方法的实现。为了省去为所有方法提供实现的麻烦,您可以使用不会使用 throw 的方法NotImplementedException

于 2012-06-14T05:05:58.463 回答