具有ASP.NET成员身份和授权的自定义数据库

时间:2013-12-08 15:06:13

标签: asp.net-mvc database

我正在学习ASP.NET MVC,之前从未使用.Net授权和成员资格工具。

我正在创建一个允许用户登录的应用程序以及他们拥有的动物,因此它将拥有多个表格

在教程中我查看了成员资格和授权工具似乎为登录数据创建了一个新数据库。如何使用我自己的自定义表?

谢谢

1 个答案:

答案 0 :(得分:3)

如果你有自定义表格,这很容易做到。但在这种情况下,您必须手动检查密码。

以下是几个简单的步骤。

首先,将表单授权添加到web.config文件中:

<authentication mode="Forms">
  <forms loginUrl="~/login" defaultUrl="/" name=".ASPXFORMSAUTH" protection="All" slidingExpiration="true" path="/" timeout="50000000" />
</authentication>

确保在RouteConfig.cs中正确配置了控制器

    routes.MapRoute("Login", "login", new { controller = "Login", action = "Login" });

根据现有表格中存储的信息制作您自己的密码验证功能:

public bool ValidatePassword(string email, string password)
{
    bool isValid = false;

    // TODO: put your validation logic here

    return isValid;
}

请注意,您可以使用用户名或电子邮件。我更喜欢电子邮件,因为用户永远不会忘记他们的电子邮件,但通常有几个用户名。

创建您的登录控制器:

public class LoginController : Controller
{

    [HttpGet]
    public ActionResult Login()
    {
        if(Request.IsAuthenticated)
        {
            return View("AlreadyLoggedIn");
        }

        return View();
    }

    [HttpPost, ValidateAntiForgeryToken]
    public ActionResult Login(LoginViewModel viewModel)
    {
        if(ModelState.IsValid)
        {
            var isPasswordValid = ValidatePassword(viewModel.Email, viewModel.Password);
            if(isPasswordValid)
            {
                FormsAuthentication.SetAuthCookie(viewModel.Email, true);

                // now the user is authenticated
                return RedirectToAction("Index", "Home");
            }
            else
            {
                ModelState.AddModelError("password", "Invalid password");
            }
        }
        return View(viewModel);
    }
}

查看模型非常简单:

public class LoginViewModel
{
    [Required(ErrorMessage = "Please type your email")]
    [EmailAddress(ErrorMessage = "Please provide correct email address")]
    public string Email { get; set; }

    [Required(ErrorMessage = "Please type your password")]
    public string Password { get; set; }
}

如果您想限制对部分网页的访问,请使用授权属性:

public class AnotherController : Controller
{
    [Authorize, HttpGet]
    public ActionResult Index()
    {
    ...
    }
}

总而言之,您只需要将所有数据库登录验证逻辑都放到ValidatePassword函数中,就是这样!