跳到主要内容

C# 在MVC中如何⽤表单认证?

参考答案:

在ASP.NET MVC中,使用表单认证(Forms Authentication)是一种常见的身份验证方式。表单认证允许用户通过提交用户名和密码的表单来进行身份验证,一旦验证通过,用户将被授予访问受保护的资源的权限。

下面是在ASP.NET MVC中使用表单认证的基本步骤:

  1. 配置Web.config

首先,你需要在Web.config文件中启用表单认证,并设置认证和授权的相关配置。

<system.web>
  <authentication mode="Forms">
    <forms loginUrl="~/Account/Login" timeout="2880" />
  </authentication>
  <authorization>
    <deny users="?" /> <!-- 拒绝匿名用户访问 -->
  </authorization>
</system.web>

这里loginUrl属性指定了登录页面的URL,当用户尝试访问受保护的资源时,他们会被重定向到这个页面。timeout属性设置了身份验证票据的过期时间。

  1. 创建登录控制器和视图

接下来,你需要创建一个控制器(例如AccountController)来处理登录请求,并创建一个登录视图(例如Login.cshtml)来显示登录表单。

// AccountController.cs
public class AccountController : Controller
{
    // GET: Account/Login
    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
        return View();
    }

    // POST: Account/Login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            // 这里添加你的身份验证逻辑,例如检查用户名和密码是否正确
            if (AuthenticateUser(model.Username, model.Password))
            {
                FormsAuthentication.SetAuthCookie(model.Username, false); // 设置身份验证票据
                if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                    && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                {
                    return Redirect(returnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home"); // 重定向到首页或其他默认页面
                }
            }
            else
            {
                ModelState.AddModelError("", "Invalid username or password.");
            }
        }

        // 如果模型状态无效,则重新显示表单
        return View(model);
    }

    private bool AuthenticateUser(string username, string password)
    {
        // 在这里实现你的身份验证逻辑,例如检查数据库中的用户凭据
        // 这里只是一个示例,实际情况下你应该使用更安全的方式来验证用户
        return username == "admin" && password == "password";
    }
}

在上面的代码中,Login方法有两个重载:一个用于GET请求,显示登录表单;另一个用于POST请求,处理登录表单的提交。AuthenticateUser方法是一个示例方法,用于验证用户名和密码。在实际应用中,你应该使用更安全的方式(如哈希和盐值)来存储和验证密码。

  1. 处理受保护的资源

对于需要保护的资源(如某些控制器操作),你可以使用[Authorize]属性来要求用户进行身份验证。例如:

// HomeController.cs
[Authorize]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }
    // 其他操作...
}

在这个例子中,任何尝试访问HomeController中的操作的用户都必须通过身份验证,否则他们会被重定向到登录页面(由loginUrl指定)。

  1. 注销功能

最后,你可能还需要提供一个注销功能,让用户能够结束他们的会话。这可以通过调用FormsAuthentication.SignOut()方法来实现:

// AccountController.cs
public ActionResult LogOff()
{
    FormsAuthentication.SignOut(); // 注销用户
    Session.Abandon(); // 放弃会话状态
    return RedirectToAction("Login", "Account"); // 重定向到登录页面
}

确保在你的登录视图中提供一个链接到注销操作的按钮或链接。

请注意,上述示例是一个基本的表单认证实现,并不包含所有最佳实践和安全性考虑。在实际项目中,你需要确保密码的存储和验证是安全的,使用HTTPS来保护用户凭据,以及考虑其他安全性因素。