C# FormsAuthentication 实现基础认证完整示例

小石头
小石头
发布时间:2026-10-14 | 4人浏览过
原创

本文提供在 C# ASP.NET 环境中使用 FormsAuthentication 类进行基本身份验证的代码示例,包括如何加密存储用户凭据到 Cookie、判断登录状态以及注销操作。

C# FormsAuthentication 核心用法

FormsAuthentication 是 .NET Framework 中用于处理基于窗体的身份验证(Forms Authentication)的核心类。它主要用于在 Web 应用中管理用户的登录状态,通常将经过加密的用户数据存储在 Cookie 中,以便在后续请求中进行身份识别。

以下是一个完整的静态工具类 Authentication 的实现,封装了常用的身份验证操作:

using System;
using System.Web;
using System.Web.Security;

namespace AuthTest
{
  public class Authentication
  {
    /// <summary>
    /// 设置用户登陆成功凭据(Cookie存储)
    /// </summary>
    /// <param name="UserName">用户名</param>
    /// <param name="PassWord">密码</param>
    /// <param name="Rights">权限</param>
    public static void SetCookie(string UserName,string PassWord,string Rights)
    {
      //构建用户数据字符串,格式为 UserName#PassWord#Rights
      String UserData = UserName + "#" + PassWord+"#"+Rights;
      
      //创建FormsAuthenticationTicket对象
      //参数依次为:版本号、用户名、创建时间、过期时间、是否持久化、UserData
      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
          1,           // Version
          UserName,    // Name
          DateTime.Now,// IssueDate
          DateTime.Now.AddMinutes(60), // Expiration (60 minutes)
          false,       // IsPersistent
          UserData     // UserData
      );
      
      //加密Ticket
      string encryptedTicket = FormsAuthentication.Encrypt(ticket);
      
      //创建Cookie并添加至响应
      HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
      HttpContext.Current.Response.Cookies.Add(cookie);
    }

    /// <summary>
    /// 判断用户是否登陆
    /// </summary>
    /// <returns>True:已登录, False:未登录</returns>
    public static bool isLogin()
    {
      return HttpContext.Current.User.Identity.IsAuthenticated;
    }

    /// <summary>
    /// 注销登陆
    /// </summary>
    public static void logOut()
    {
      FormsAuthentication.SignOut();
    }

    /// <summary>
    /// 获取凭据中的用户名
    /// </summary>
    /// <returns>用户名</returns>
    public static string getUserName()
    {
      if (isLogin())
      {
        string strUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
        string[] UserData = strUserData.Split('#');
        if (UserData.Length != 0)
        {
          return UserData[0];
        }
        else
        {
          return "";
        }
      }
      else
      {
        return "";
      }
    }

    /// <summary>
    /// 获取凭据中的密码
    /// </summary>
    /// <returns>密码</returns>
    public static string getPassWord()
    {
      if (isLogin())
      {
        string strUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
        string[] UserData = strUserData.Split('#');
        if (UserData.Length!=0)
        {
          return UserData[1];
        }
        else
        {
          return "";
        }
      }
      else
      {
        return "";
      }
    }

    /// <summary>
    /// 获取凭据中的用户权限
    /// </summary>
    /// <returns>用户权限</returns>
    public static string getRights()
    {
      if (isLogin())
      {
        string strUserData = ((FormsIdentity)(HttpContext.Current.User.Identity)).Ticket.UserData;
        string[] UserData = strUserData.Split('#');
        if (UserData.Length!=0)
        {
          return UserData[2];
        }
        else
        {
          return "";
        }
      }
      else
      {
        return "";
      }
    }
  }
}

关键功能说明

第1步:创建并加密认证Ticket

目的: 将用户身份信息序列化并加密,安全地存储于客户端 Cookie 中。
入口: SetCookie(string UserName, string PassWord, string Rights)
动作: 实例化 FormsAuthenticationTicket,指定有效期(如60分钟),调用 FormsAuthentication.Encrypt 方法对 Ticket 进行加密,防止数据篡改。随后创建 HttpCookie 并将其附加到当前 HTTP 响应中。
重要参数: IsPersistent 设为 false 表示会话级 Cookie,浏览器关闭即失效;若设为 true 则为持久化 Cookie。
完成状态: 浏览器收到 Set-Cookie 头,且 Cookie 值为加密后的 Ticket 字符串。

第2步:检查用户登录状态

目的: 在页面或控制器中快速判断当前请求是否来自已认证用户。
入口: isLogin()
动作: 直接访问 HttpContext.Current.User.Identity.IsAuthenticated。
完成状态: 返回布尔值 true 或 false。

第3步:注销当前会话

目的: 清除服务器端认证标识并通知客户端删除相关 Cookie。
入口: logOut()
动作: 调用 FormsAuthentication.SignOut(),该方法会自动清除 FormsAuth 相关的 Cookie 并重定向至默认登录页(如果配置了重定向)。
完成状态: 用户的认证状态被撤销,后续请求需重新登录。

第4步:从 Ticket 中提取用户数据

目的: 获取存储在 UserData 字段中的自定义信息(如用户名、权限等)。
入口: getUserName(), getPassWord(), getRights()
动作: 首先通过 (FormsIdentity)HttpContext.Current.User.Identity 获取当前的 FormsIdentity 对象,然后读取其 Ticket.UserData 属性。由于 UserData 是以 "#" 分隔的字符串,需使用 Split('#') 解析出具体字段。
注意: 原文代码中 getUserName() 返回时调用了 .ToString(),但字符串类型无需额外转换,可直接返回数组元素。

注意事项与安全建议

  • 敏感数据存储: 上述示例中将“密码”明文存储在 UserData 中仅用于演示。在实际生产环境中,绝对不应将明文密码或其他高敏感数据存入 Cookie。应仅存储用户ID、角色或令牌,敏感校验应在服务器端会话(Session)或数据库中比对。
  • Cookie安全: 确保启用 HTTPS,并在配置中设置 requireSSL 和 httpOnly 属性,以防止 Cookie 窃取和 XSS 攻击。
  • 过期策略: 根据应用需求合理设置 Ticket 的过期时间。长时间有效的 Cookie 会增加安全风险。

以上就是 C# 中 FormsAuthentication 用法的详细内容,更多关于 C# Web 身份验证的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表