ASP.NET

Request 获取 url 信息的各种方法比较

在ASP.NET编程中经常需要用Request获取url的有关信息,Request中有多种方法获取url信息,但我经常忘了各种方法的具体作用,今天我就写了个测试程序,将各种方法得到的结果列出来,以后用时直接参考一下就行了。
测试的url地址是http://www.test.com/testweb/default.aspx, 结果如下:

Request.ApplicationPath: /testweb
Request.CurrentExecutionFilePath: /testweb/default.aspx
Request.FilePath: /testweb/default.aspx
Request.Path: /testweb/default.aspx
Request.PathInfo:
Request.PhysicalApplicationPath: E:\WWW\testweb\
Request.PhysicalPath: E:\WWW\testweb\default.aspx
Request.RawUrl: /testweb/default.aspx
Request.Url.AbsolutePath: /testweb/default.aspx
Request.Url.AbsoluteUri: http://www.test.com/testweb/default.aspx
Request.Url.Host: www.test.com
Request.Url.LocalPath: /testweb/default.aspx

源代码部署Discuz!NT和同步注册登录过程详解

2008-11-15 日重新下载的,打开解决方案,生成,Discuz.Data.Access 项目的几个警告,由于目录也不需要用到 Access,把它从解决方案移除;然后重新生成解决方案:

========== 全部重新生成: 成功 24 个,失败 0 个,跳过 0 个 ==========


复制 Discuz.Web 目录,删除与部署到服务器无关的文件(upgrade 目录不要删除,如果不是升级的就建个空目录就好了,不用把目录里的文件都传上去,安装好就可以把目录删除,也不知道为何要检测这个目录!),设置好虚拟目录(默认的话要在虚拟目录的默认文档里加上 forumindex.aspx),然后运行 /bbs/install/index.aspx 进行安装(数据库连接我是用 sa,安装后记得改过来,也可能用普通用户安装),安装之前记得把目录的权限设置好(要方便就直接将论坛目录给 Users 组修改权限)。

在客户端安装时,到最后一步出现了个错误(错误源:未将对象引用设置到对象的实例),看了代码应该是在初始化数据库数据时出错,把 try 去掉(想看下是什么错误),编译下把 Discuz.Install.dll 重传下,干脆在服务器上重新安装一下,却没错误,真晕。


然后删除 install 后无用的文件,分别删除 install,upgrade 这两个目录,把 bin 目录下的以下文件也删除:

Discuz.Install.dll
Discuz.Data.Access.dll
Discuz.Data.MySql.dll
MySql.Data.dll

然后进行系统后台配置,除了一些常规设置,主要改一下积分策略和去掉友情连接,去掉扣分的;完了换论坛 Logo!

下面是修改代码部分,首先移除暂时没用到的项目:

Discuz.Album
Discuz.Space
Discuz.Space.Modules.Album
Discuz.Space.Modules
Discuz.Data.Access
Discuz.Data.MySQL
Discuz.Mall

删除 Web 目录下 bin 目录的所有文件(除 Newtonsoft.Json.dll 之外,Discuz.Data.SqlServer 引用到了 Interop.SQLDMO.dll,如果要使 Discuz.Data.SqlServer 能通过编译,Interop.SQLDMO.dll 文件也不能删除,还是留着吧),生成 Web 项目。
把 Discuz.Data.SqlServer.dll 和 Discuz.Web.Admin.dll Copy 到 Web 的 bin 目录下,不要将这两项目引用到 Web 项目里!


接下来就是将 zq_Users 的用户导入论坛,将两个表的用户同步;如果用户数不多的话,可以在两边人工注册。同步好用户表后将同步注册、登录、更新用户资料程序更新上去!

至于注册、登录、更新资料的同步,做法如下:

主站这边:

添加一个扩展类 Extensions,对 User 类添加一个扩展方法(CreateUpdateBBSUser),用于向论坛用户表添加、修改、删除用户信息;然后只要在相应页面添加调用代码即可,如在注册时:

// 注册到论坛
user.CreateUpdateBBSUser(ActionType.Add);

添加调用的页面有:

/register.aspx.cs
/login.aspx.cs
/logout.aspx
/controls/userinfo.ascx
/user/my_baseinfo.aspx.cs
/admin/useradmin.aspx.cs(删除,以大林苑为例)
/admin/useraction.aspx.cs(编辑)


同步登录方面,从主站登录的,用 ajax 异步调用新增加登录论坛的页面(/aspx/1/loginuser.aspx),登录亦然(/aspx/1/logoutuser.aspx),页面代码如下:

// 代码:/aspx/1/loginuser.aspx
<%@ Page language="c#" AutoEventWireup="false" EnableViewState="false" %>
<%@ Import Namespace="Discuz.Common" %>
<%@ Import Namespace="Discuz.Forum" %>
<%@ Import Namespace="Discuz.Config" %>

<%

// 验证用户
int uid = Users.CheckPassword(DNTRequest.GetString("u"), DNTRequest.GetString("p"), true);
if (uid != -1)
{
    //删除之前的错误登录信息
    LoginLogs.DeleteLoginLog(DNTRequest.GetIP());

    //根据积分公式刷新用户总积分
    UserCredits.UpdateUserCredits(uid);

    //写入用户登录后的cookie
    ForumUtils.WriteUserCookie(uid, -1, GeneralConfigs.GetConfig().Passwordkey);

    //更新该用户最后访问时间
    Users.UpdateUserLastvisit(uid, DNTRequest.GetIP());

    Statistics.ReSetStatisticsCache();

    Response.Redirect("/");
}

%>

 

// 代码:/aspx/1/logoutuser.aspx
<%@ Page language="c#" AutoEventWireup="false" EnableViewState="false" %>
<%@ Import Namespace="Discuz.Common" %>
<%@ Import Namespace="Discuz.Forum" %>
<%@ Import Namespace="Discuz.Config" %>

<%
GeneralConfigInfo config = GeneralConfigs.GetConfig();
Discuz.Entity.OnlineUserInfo oluserinfo = OnlineUsers.UpdateInfo(config.Passwordkey, config.Onlinetimeout);

OnlineUsers.DeleteRows(oluserinfo.Olid);
ForumUtils.ClearUserCookie();

if (!DNTRequest.GetString("r").Equals(""))
    Response.Redirect(DNTRequest.GetString("r"));
else
    Response.Redirect("/");
%>

 

论坛这边:

首先将 Discuz.Web 项目的 .Net Framework 改为 3.5的,并添加 System.Xml.Linq 和 ZhengQuan.Framework 的引用。

论坛注册的,同样也是采用扩展类,添加一个扩展类(\UI\Extensions.cs),对 UserInfo 类添加一个扩展方法(CreateUpdateMainSiteUser),同样在注册修改等页面添加相应的调用代码即可。

论坛添加调用的文件有:

/aspx/1/register.aspx.cs 行279-280
/aspx/1/usercpprofile.aspx.cs 行185-188
/aspx/1/usercpnewpassword.aspx.cs 行74-76

论坛后台的暂时没考虑,因为考虑对用户操作一般在系统后台,有空再加上。


从论坛的登录和退出无和主站同步!


如果不用导入数据,至此,论坛的部署就到此结束。

[转]urlrewriter时Theme失效的解决办法

重写Page的OnInitComplete方法:

       protected override void OnInitComplete(EventArgs e)
       {
            base.OnInitComplete(e);

            foreach (Control ctr in this.Header.Controls)
            {
                if (ctr is HtmlLink)
                {
                    HtmlLink link = ctr as HtmlLink;
                    link.Href = this.ResolveUrl(link.Href);
                }
            }
       }

没事看看,不要忘了

0. 序列化概念

序列化是将对象转换为容易传输的格式的过程。例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象。反之,反序列化根据流重新构造对象。

XML 序列化仅将对象的公共字段和属性值序列化为 XML 流。

1. XmlSerializer 类

将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。XmlSerializer 使您得以控制如何将对象编码到 XML 中。

2. 什么是 XML 序列化?

XML 序列化是将对象的公共属性 (Property) 和字段转换为序列格式(这里是指 XML)以便存储或传输的过程。

3. 什么是 XML 反序列化?

XML 反序列化则是从 XML 输出中重新创建原始状态的对象。

4. Stream 类

提供字节序列的一般视图。

5. FileStream 类

公开以文件为主的 Stream,既支持同步读写操作,也支持异步读写操作。

6. File 类

提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建 FileStream 对象。

7. BinaryFormatter 类

以二进制格式将对象或整个连接对象图形序列化和反序列化。

8. void BinaryFormatter.Serialize 函数

已重载。将对象或连接对象图形序列化为给定流。

9. Object BinaryFormatter.Deserialize 函数

将指定的流反序列化为对象图形。

10. XmlSerializer 类

将对象序列化到 XML 文档中和从 XML 文档中反序列化对象。XmlSerializer 使您得以控制如何将对象编码到 XML 中。

属性控制由 XmlSerializer 类生成的 XML 流,使您可以设置 XML 流的 XML 命名空间、元素名、属性名等。

11. XPathNavigator 类

XPathNavigator 类提供的方法用于在 XPathDocument 或 XmlDocument 对象中浏览节点,提取 XML 数据,以及访问强类型 XML 数据。


12. XPathNavigator.Evaluate(重载) 函数

计算指定的 XPath 表达式并返回类型化结果。

13. XPathNavigator.Compile(string xpath)
编译一个表示 XPath 表达式的字符串,并返回 XPathExpression 对象。

14. internal 关键字是类型和类型成员的访问修饰符。只有在同一程序集的文件中,内部类型或成员才是可访问的。

在方法或属性声明中使用 abstract 修饰符以指示方法或属性不包含实现。

在派生类中,通过包括使用 override 修饰符的属性声明,可以重写抽象的继承属性。

15. static 的构造函数的好处在于,当我们调用一个类的静态成员之前,它会自动执行!

正则表达式

摘自 http://topic.csdn.net/t/20060521/12/4767451.html 未经验证

 

  "^\\d+$"  //非负整数(正整数   +   0)    
  "^[0-9]*[1-9][0-9]*$"  //正整数    
  "^((-\\d+)|(0+))$"  //非正整数(负整数   +   0)    
  "^-[0-9]*[1-9][0-9]*$"  //负整数    
  "^-?\\d+$"    //整数    
  "^\\d+(\\.\\d+)?$"  //非负浮点数(正浮点数   +   0)    
  "^(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*))$"  //正浮点数    
  "^((-\\d+(\\.\\d+)?)|(0+(\\.0+)?))$"  //非正浮点数(负浮点数   +   0)    
  "^(-(([0-9]+\\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\\.[0-9]+)|([0-9]*[1-9][0-9]*)))$"  //负浮点数    
  "^(-?\\d+)(\\.\\d+)?$"  //浮点数    
  "^[A-Za-z]+$"  //由26个英文字母组成的字符串    
  "^[A-Z]+$"  //由26个英文字母的大写组成的字符串    
  "^[a-z]+$"  //由26个英文字母的小写组成的字符串    
  "^[A-Za-z0-9]+$"  //由数字和26个英文字母组成的字符串    
  "^\\w+$"  //由数字、26个英文字母或者下划线组成的字符串    
  "^[\\w-]+(\\.[\\w-]+)*@[\\w-]+(\\.[\\w-]+)+$"    //email地址    
  "^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$"  //url

 

for more information: http://topic.csdn.net/t/20060521/12/4767451.html

CS 的用户登录

  CommunityServer 在用户登录后只是将用户标签写入 Cookies,在应用时判断用户是否登录是件容易的事,但要在请求在共享一个用户的所有信息还是得从 Cache或数据库读取。所以判断用户登录与获取用户资料是两回事,要区分来做。

DataSet 中的 Relations 属性

示例来自 MSDN,将四个表关联在一起,适应于在操作多表时,有时需要关联表有时不需要关联的情况下(见 CommunityServer 的 cs_shared_Threads_GetThreadSet 存储过程也属此类应用)。

using System;
using System.Data;
using System.Data.SqlClient;

namespace TestDataRelation
{

    class Program
    {
        static void Main()
        {
            PrintOrders("server=(local); uid=sa; pwd=; database=Test_DataSet_DataRelation");
        }

        private static void PrintOrders(string connectionString)
        {
            using (SqlConnection connection = new SqlConnection(connectionString))
            {
                DataSet customerOrders = new DataSet();

                connection.Open();

                SqlDataAdapter reader;

                reader = new SqlDataAdapter("SELECT * FROM Customers", connection);
                reader.Fill(customerOrders, "Customers");

                reader = new SqlDataAdapter("SELECT * FROM Orders", connection);
                reader.Fill(customerOrders, "Orders");

                reader = new SqlDataAdapter("SELECT * FROM OrderDetails", connection);
                reader.Fill(customerOrders, "OrderDetails");

                reader = new SqlDataAdapter("SELECT * FROM Products", connection);
                reader.Fill(customerOrders, "Products");

                connection.Close();

                DataRelation customerOrdersRelation = customerOrders.Relations.Add("CustOrders", customerOrders.Tables["Customers"].Columns["CustomerID"], customerOrders.Tables["Orders"].Columns["CustomerID"]);
                DataRelation orderDetailRelation = customerOrders.Relations.Add("OrderDetail", customerOrders.Tables["Orders"].Columns["OrderID"], customerOrders.Tables["OrderDetails"].Columns["OrderID"], false);
                DataRelation orderProductRelation = customerOrders.Relations.Add("OrderProducts", customerOrders.Tables["Products"].Columns["ProductID"], customerOrders.Tables["OrderDetails"].Columns["ProductID"]);

                // 打印所有订单及订单详情
                foreach (DataRow custRow in customerOrders.Tables["Customers"].Rows)
                {
                    Console.WriteLine("客户 ID: " + custRow["CustomerID"] + "\t客户姓名: " + custRow["CustomerName"]);
                    Console.WriteLine("----------------------------------------");

                    foreach (DataRow orderRow in custRow.GetChildRows(customerOrdersRelation))
                    {
                        Console.WriteLine("  订单号: " + orderRow["OrderID"]);
                        Console.WriteLine("\t订单日期: " + orderRow["OrderDate"]);

                        foreach (DataRow detailRow in orderRow.GetChildRows(orderDetailRelation))
                        {
                            Console.WriteLine("\t Product: " + detailRow.GetParentRow(orderProductRelation)["ProductName"]);
                            Console.WriteLine("\t Quantity: " + detailRow["Quantity"]);
                        }

                        Console.WriteLine();
                    }
                }

            }
        }
    }

}

MSDN:

请注意,当为 Customers 表和 Orders 表创建 DataRelation 时,没有为 createConstraints 标志指定任何值(默认为 true)。它假定 Orders 表中的所有行都具有一个存在于父 Customers 表中的 CustomerID 值。如果 CustomerID 存在于 Customers 表之外的 Orders 表中,则 ForeignKeyConstraint 将引发异常。

如果子列可能包含父列不包含的值,添加 DataRelation 时请将 createConstraints 标志设置为 false。在该示例中,对于 Orders 表和 OrderDetails 表之间的 DataRelation,createConstraints 标志将设置为 false。这样,应用程序就可以返回 OrderDetails 表中的所有记录并只返回 Orders 表中记录的子集,而不会生成运行时异常。

CommunityServer 2.1 的 CSCopy 类

  此类支持序列化,此类的主要动作是根据子类的默认构造函数创建一个子类实例,objects 字段是 Hashtable 类型,存放一个键值对,它的键的类型是 Type 类型,值类型是 ConstructorInfo 类型,也就是它存放的是代表子类的构造函数的类型,作用是利用此构造函数类实例 Invoke 出子类的一个实例。

  CSCopy 类还有一个虚拟的成员函数 Copy(),一般地,子类继承时重写此类,然后在子类的 Copy() 函数里调用基类的 CreateNewInstance() 函数(或用 base.Copy())创建对象后,将子类中各成员变量的值赋给新创建的实例。如:

    public override object Copy()
    {
        Thread thread = base.Copy() as Thread;  // 调用 Thread 类的默认构造函数创建的实例

        // 以下的赋值是将当前对象(看到都用 this 了吧)的各成员变量的值赋给新对象,
        // 也就等于 Copy 一个副本,呵呵,从类名都可以看出来
        thread.MostRecentPostAuthor = this.MostRecentPostAuthor;
        thread.MostRecentPostAuthorID = this.MostRecentPostAuthorID;
        thread.AuthorID = this.AuthorID;
        thread.Status = this.Status;
        thread.IsSticky = this.IsSticky;
        thread.StickyDate = this.StickyDate;
        thread.MostRecentPostID = this.MostRecentPostID;

        return thread;
    }

    继承此类的子类一般是需要将对象 Copy 一份,然后另作它用。如:

    public virtual String RenderedBody(PostTarget target)
    {
        Post p = this.Copy() as Post;

        if (p.Section != null)
            CSEvents.PreRenderPost(p,p.Section.ApplicationType,target);
        else
            CSEvents.PreRenderPost(p,ApplicationType.Unknown,target);

        return p.FormattedBody;
    }

对 ASP.NET 控件的一点理解(整理)

Web 服务器控件和 Html 服务器控件


  一般地,在用 ASP.NET 开发 Web 应用程序时,时时刻刻都与控件打交道,可以说是无处不在,其实 Web 窗体页(.aspx 页)也是控件。

  ASP.NET 控件分为 Web 服务器控件(简称 Web 控件)和 Html 服务器控件(简称 Html 控件),都是运行在服务器端。两者有什么区别呢?

  我们平时用的 HTML 标记,如 <a>、<input> 等,是无法用程序来控制它们的,需用其它如 JavaScript 等程序语言才能得以控制。在 ASP.NET 程序里,我们可以在 HTML 标记加上 runat="server",就可以将相应的 HTML 标记变成 HTML 服务器控件,从而可以以编程的方式来控制这些 HTML 标记。引用(http://www.dvbbs.net/tech/net/2006051268338.asp):


  至于 Html 标注和 Html 控件之间的区别很明显,Html 控件是运行于服务器端,Html 标注是运行于客户端。具体来说:当 ASP.NET 网页执行时,会检查标注有无 runat 属性,如果标注没有设定,那么 Html 标注就会被视为字符串,并被送到字符串流等待送到客户端,客户端的浏览器会对其进行解释;如果 Html 标注有设定 runat="server" 属性,Page 对象会将该控件放入控制器,服务器端的代码就能对其进行控制,等到控制执行完毕后再将 Html 控件的执行结果转换成 Html 标注,然后当成字符串流发送到客户端进行解释。

  对于 Web 服务器控件,是 Web 窗体页中用来定义 Web 应用程序用户界面的组件,是 Web Forms 编程模型的基本元素,尽管 Web 服务器控件呈现为 HTML,但它们的对象模型不一定反映 HTML 语法。

  1、Asp.net 服务器控件提供更加统一的编程接口,如每个 Asp.net 服务器控件都有 Text 属性。

  2、隐藏客户端的不同,这样程序员可以把更多的精力放在业务上,而不用去考虑客户端的浏览器是 ie 还是 firefox,或者是移动设备。

  3、Asp.net 服务器控件可以保存状态到 ViewState 里,这样页面在从客户端回传到服务器端或者从服务器端下载到客户端的过程中都可以保存。

  4、事件处理模型不同,Html 标注和 Html 控件的事件处理都是在客户端的页面上,而 Asp.net 服务器控件则是在服务器上。


创建自定义服务器控件


  一、简述:


  创建用户控件或服务器控件一般是继承于 System.Web.UI.Control 类或 System.Web.UI.WebControls.WebControl 类。如 Web 用户控件(.ascx 页)继承于 System.Web.UI.UserControl 类,后者继承于 System.Web.UI.TemplateContorl 类,后者又继承于 System.Web.UI.Control 类,而 Web 窗体页(.aspx 页)也继承于 System.Web.UI.TemplateContorl 类,为什么中间要多出这些类呢?这些中间类都主要是提供一些共享的属性、方法和事件,总不能把所有的功能都放在 Control 类吧。TemplateContorl 类为 Page 类和 UserControl 类提供一组基本功能。而 Control 类为所有 ASP.NET 服务器控件提供共享的属性、方法和事件,它作为开发自定义 ASP.NET 服务器控件时的派生源的主要类(为什么要说“的主要类”是因为开发这些控件时往往还要实现其它接口以完成更多功能)。咱们平时用得最多的 TextBox 控件则是继承于 System.Web.UI.WebControls.WebControl 类。后者同样也是继承于 System.Web.UI.Control 类。

  Control 没有任何针对用户界面 (UI) 的功能。如果要创建没有 UI 的控件或者组合其他呈现它们自己的 UI 的控件,则从 Control 派生。如果要创建具有 UI 的控件,则从 WebControl 或 System.Web.UI.WebControls 命名空间中的任何控件派生,该命名空间为自定义控件提供适当的起点。

  System.Web.UI.WebControls 命名空间包含一些呈现为 HTML 标记的类,如 TextBox 控件和 ListBox 控件。该命名空间还包含一些不在网页上呈现、但支持数据操作的类,如 SqlDataSource 类和 ObjectDataSource 类。其他一些控件(如 GridView 控件和 DetailsView 控件)支持数据显示和编辑。WebControl 类用作 System.Web.UI.WebControls 命名空间中许多类的基类。


  二、例子:

  1. 一个 MSDN 的例子,创建一个从 Control 类继承且无 UI 功能的控件:


    // MyControl.cs
    using System;
    using System.Web.UI;

    namespace DemoControl
    {
        public class MyControl : System.Web.UI.Control
        {
            protected override void Render(HtmlTextWriter writer)
            {
                if (HasControls() && (Controls[0] is LiteralControl))
                {
                    writer.Write("<H2>Your Message : ");
                    Controls[0].RenderControl(writer);
                    writer.Write("</H2>");
                }
            }
        }
    }

    然后在 aspx 页注册该控件并使用:

    // Test.aspx
    <%@ Page Language="C#" %>
    <%@ Register TagPrefix="UC" Namespace="DemoControl" Assembly="Demo" %>

    <UC:MyControl runat="server">
        <asp:Literal runat="server" Text="http://pcvc.net" />
    </UC:MyControl>

    运行结果:

    <H2>Your Message : </H2>
    http://pcvc.net


  2. 还是 MSDN 的例子:


    namespace SpanControl
    {
        using System;
        using System.Web.UI;
        using System.Web.UI.WebControls;
   
        // Renders the following HTML:
        // <span onclick="alert('Hello');" style="color:Red;">Custom Contents</span>
   
        public class MyWebControl : WebControl
        {
            public MyWebControl() : base(HtmlTextWriterTag.Span)
            { }

            [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
            protected override void AddAttributesToRender(HtmlTextWriter writer)
            {
                writer.AddAttribute(HtmlTextWriterAttribute.Onclick, "alert('Hello');");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Color, "Red");
                writer.AddStyleAttribute(HtmlTextWriterStyle.Cursor, "Pointer");
                base.AddAttributesToRender(writer);
            }

            [System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.Write("Custom Contents");
                base.RenderContents(writer);
            }
        }
    }

    在 aspx 页注册该控件并使用:

    // spancontrol.aspx
    <%@ Page Language="C#" %>
    <%@ Register TagPrefix="UC" Namespace="SpanControl" Assembly="Demo" %>

    <UC:MyWebControl runat="server" />

    运行结果:

    <span onclick="alert('Hello');" style="color:Red;cursor:Pointer;">Custom Contents</span>

使用 Forms 身份验证的一点点心得

如果采用 Forms 验证,当用户通过验证后 Context.User.Identity 或 Page.User.Identity 是一个 System.Security.Principal.IIdentity


System.Security.Principal 命名空间定义表示代码在其中运行的安全上下文的用户对象。

未验证:

Context.User: System.Security.Principal.GenericPrincipal,实现 System.Security.Principal.IPrincipal 接口,表示一般用户
Context.User.Identity: System.Security.Principal.GenericIdentity,实现 System.Security.Principal.IIdentity 接口,表示一般用户

Forms 验证后:

Context.User: 同与未验证
Context.User.Identity: System.Web.Security.FormsIdentity,实现 System.Security.Principal.IIdentity 接口,表示一个使用 Forms 身份验证进行了身份验证的用户标识。


可以根据需要创建自己的用户对象(Principal),需要实现 System.Security.Principal.IPrincipal 接口。


验证后,可以用 FormsAuthentication.SetAuthCookie("UserName", true); 给以 UserName 为用户创建一个票据,事实上是创建一个 Cookies,创建之后,用户在访问那些需要通过用户验证才能访问的页时就不用每次提供票据了(也就是不用每次都输入用户名和密码去登录)。此 Cookies 的过期时间在 web.config 里设置如:

    <authentication mode="Forms">
      <forms name="GLUserAuth" loginUrl="Login.aspx" timeout="10" />
    </authentication>

如以上设置,若用户在 10 分钟内未对应用程序进行任何操作,此票据(cookies)将自动失效。

怎样设置哪些页需要用户通过身份验证后才能访问,用 <location> 配置节:

  <location path="EditUser.aspx">
    <system.web>
      <authorization>
        <deny users="?" />
      </authorization>
    </system.web>
  </location>

当然啦,如果所有页都需要就不是这样设置的了。最后可以用:FormsAuthentication.SignOut() 方法从浏览器删除 Forms 身份验证票证。

页次:1/2   每页 10 条   共 20 条   9 1 2 :