You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现基于XML文件的C# ASP.NET MVC登录表单?

基于XML的ASP.NET MVC登录验证实现

问题背景

刚接触C# ASP.NET MVC,想要实现一个不依赖数据库、读取XML文件验证的登录表单,验证用户输入的邮箱和密码与XML中数据匹配后完成跳转,但当前HomeController的验证逻辑卡住,现有代码如下:

XML文件内容

<?xml version="1.0" encoding="utf-8"?>
<Users>
    <User>
        <Name>Test</Name>
        <Password>123</Password>
        <Email>test@hotmail.com</Email>
        <UserID>Admin</UserID>
    </User>
</Users>

现有HomeController代码

[HttpPost]
public ActionResult Login(Models.Registration obj)
{
    if (ModelState.IsValid)
    {
        IEnumerable<string> email = from users in
                                        XDocument.Load(Server.MapPath("~/XML/User.xml")).Descendants("Users")
                                    select users.Element("Email").Value;

        IEnumerable<string> password = from users in
                        XDocument.Load(Server.MapPath("~/XML/User.xml")).Descendants("Users")
                                       select users.Element("password").Value;

        foreach (var user in email)
        {
             // stuck at this part
        }
    }

    return View();
}

现有Login.cshtml视图代码

@{ 
    ViewBag.Title = "Login";
}

<h2 id="title">@ViewBag.Title</h2>

<div>
    @using (Html.BeginForm("Login", "Home", FormMethod.Post))
    {
        <table>
            <tr>
                <td>@Html.LabelFor(a => a.Email):</td>
                <td>@Html.TextBoxFor(a => a.Email)</td>
                <td>@Html.ValidationMessageFor(a => a.Email)</td>
            </tr>
            <tr>
                <td>@Html.LabelFor(a => a.Password):</td>
                <td>@Html.PasswordFor(a => a.Password)</td>
                <td>@Html.ValidationMessageFor(a => a.Password)</td>
            </tr>
            <tr>
                <td colspan="2" align="right">
                    <input type="submit" value="Login"/>
                </td>
            </tr>
        </table>
    }
</div>

解决方案

1. 修正XML读取逻辑

原代码存在两个关键错误:

  • 节点读取错误:Descendants("Users")应改为Descendants("User"),因为<Users>是根节点,用户数据存放在<User>子节点中
  • 分开读取邮箱和密码无法对应,应直接查询匹配当前输入的用户

2. 完善登录验证与跳转逻辑

修改后的HomeController代码:

using System.Linq;
using System.Xml.Linq;
using System.Web.Security;
using System;

[HttpPost]
public ActionResult Login(Models.Registration obj)
{
    if (ModelState.IsValid)
    {
        // 加载XML文件
        var xmlPath = Server.MapPath("~/XML/User.xml");
        var doc = XDocument.Load(xmlPath);

        // 查询匹配的用户(注意XML节点大小写:Password为大写开头)
        var matchedUser = doc.Descendants("User")
            .FirstOrDefault(u => 
                u.Element("Email").Value.Equals(obj.Email, StringComparison.OrdinalIgnoreCase) && 
                u.Element("Password").Value == obj.Password);

        if (matchedUser != null)
        {
            // 登录成功,记录用户身份
            FormsAuthentication.SetAuthCookie(matchedUser.Element("UserID").Value, false);
            // 跳转到首页或指定页面
            return RedirectToAction("Index", "Home");
        }
        else
        {
            // 验证失败,添加错误提示
            ModelState.AddModelError("", "邮箱或密码错误");
        }
    }

    // 验证失败或模型无效,返回登录视图
    return View(obj);
}

3. 补充Registration模型(若未定义)

确保Models/Registration.cs包含对应属性:

using System.ComponentModel.DataAnnotations;

namespace YourProjectName.Models
{
    public class Registration
    {
        [Required(ErrorMessage = "请输入邮箱")]
        [EmailAddress(ErrorMessage = "请输入有效的邮箱地址")]
        public string Email { get; set; }

        [Required(ErrorMessage = "请输入密码")]
        public string Password { get; set; }
    }
}

4. 视图优化(添加错误提示)

在Login.cshtml中添加全局错误提示:

@{ 
    ViewBag.Title = "Login";
}

<h2 id="title">@ViewBag.Title</h2>

<!-- 全局错误提示 -->
@if (!ViewData.ModelState.IsValid)
{
    <div class="alert alert-danger">
        @Html.ValidationSummary(false, "", new { @class = "text-danger" })
    </div>
}

<div>
    @using (Html.BeginForm("Login", "Home", FormMethod.Post))
    {
        <table>
            <tr>
                <td>@Html.LabelFor(a => a.Email):</td>
                <td>@Html.TextBoxFor(a => a.Email)</td>
                <td>@Html.ValidationMessageFor(a => a.Email)</td>
            </tr>
            <tr>
                <td>@Html.LabelFor(a => a.Password):</td>
                <td>@Html.PasswordFor(a => a.Password)</td>
                <td>@Html.ValidationMessageFor(a => a.Password)</td>
            </tr>
            <tr>
                <td colspan="2" align="right">
                    <input type="submit" value="Login"/>
                </td>
            </tr>
        </table>
    }
</div>

注意事项

  • 密码安全:示例使用明文存储密码,生产环境建议用哈希算法(如SHA256)存储加密后的密码,验证时对用户输入的密码加密后再比对
  • XML权限:确保XML文件所在目录有读取权限,避免文件读取失败
  • 路径验证:确认Server.MapPath("~/XML/User.xml")指向的路径正确,XML文件确实存在该位置

内容的提问来源于stack exchange,提问作者allen walker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 13:50:30