<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://communityserver.cn/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CHS"><title type="html">杨山河的CS 分享系列</title><subtitle type="html" /><id>http://communityserver.cn/blogs/shanhe/atom.aspx</id><link rel="alternate" type="text/html" href="http://communityserver.cn/blogs/shanhe/default.aspx" /><link rel="self" type="application/atom+xml" href="http://communityserver.cn/blogs/shanhe/atom.aspx" /><generator uri="http://communityserver.org" version="4.0.30417.1769">Community Server</generator><updated>2007-12-13T07:43:00Z</updated><entry><title>分享 Community Server 系列之五: UrlRewrite</title><link rel="alternate" type="text/html" href="/blogs/shanhe/archive/2008/01/16/community-server-urlrewrite.aspx" /><id>/blogs/shanhe/archive/2008/01/16/community-server-urlrewrite.aspx</id><published>2008-01-16T23:28:00Z</published><updated>2008-01-16T23:28:00Z</updated><content type="html">大凡Context，根据单词的字面意义，我们大概都知道是关于某些进程或者线程的执行上下文，通常asp.net的请求会为每一个请求准备一个执行管道，也会准备一个执行环境上下文，这就是HttpContext。 
&lt;div&gt;&lt;/div&gt;
&lt;div&gt;CS认为HttpContext的信息并不直接，无法满足各项功能的直接需求，为了能够更好的处理当前请求，并与高度灵活的配置其他可定制部分协同处理执行请求，为此集成HttpContext实现了一个新的描述执行环境上下文CSContext.&lt;/div&gt;
&lt;div&gt;由于需要通常Context在asp.net执行环境来说通常（不通常才怪）是单例的（这需要分析asp.net的执行原理http请求的生命周期，并非本人在此探讨的重点），所以往往这类对象的构造函数也是单例实现的。查看CSContext的构造函数，都只有私有的构造函数，并且public的只有静态实例化函数：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; CSContext CreateEmptyContext()&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //创建空的执行上下文对象&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext csContext = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSContext(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; Uri(&amp;quot;http://CreateEmptyContext&amp;quot;),&amp;quot;http://CreateEmptyContext&amp;quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext._isEmpty = &lt;span style="COLOR:blue;"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SaveContextToStore(csContext);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; csContext;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; CSContext Create(&lt;span style="COLOR:blue;"&gt;int&lt;/span&gt; settingsID)&amp;nbsp;&amp;nbsp; //根据站点ID来构造执行上下文对象&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; SiteSettings siteSettings = SiteSettingsManager.GetSiteSettings(settingsID);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext csContext;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;try&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSContext(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; Uri(siteSettings.SiteDomainUrl), siteSettings.SiteDomainUrl);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;catch&lt;/span&gt;(Exception ex)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSException csException = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSException(CSExceptionType.UnknownError, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Format(&amp;quot;CSContext failed to load a valid url for settingsid {0}. Url in database {1}. Reason {2}&amp;quot;, settingsID, siteSettings.SiteDomainUrl, ex.Message));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csException.Log(settingsID);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSContext(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; Uri(&amp;quot;http://CreateEmptyContext&amp;quot;), &amp;quot;http://CreateEmptyContext&amp;quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext.SiteSettings = siteSettings;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SaveContextToStore(csContext);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; csContext;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; CSContext Create(HttpContext context)&amp;nbsp;&amp;nbsp; //利用HttpContext来封装执行上下文&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; Create(context,&lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; CSContext Create(HttpContext context, &lt;span style="COLOR:blue;"&gt;bool&lt;/span&gt; isReWritten) //是否允许url重写？&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext csContext = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSContext(context,&lt;span style="COLOR:blue;"&gt;true&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext.IsUrlReWritten = isReWritten;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SaveContextToStore(csContext);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; csContext;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;//携带一个Url重写指代来构造执行上下文对象&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; CSContext Create(HttpContext context, UrlReWriterDelegate rewriter)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext csContext = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSContext(context,&lt;span style="COLOR:blue;"&gt;false&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SaveContextToStore(csContext);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext.IsUrlReWritten = rewriter(context);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext._queryString = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; NameValueCollection(context.Request.QueryString);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; csContext;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; CSContext Create(Uri uri, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; appName)//根据Uri和应用程序名来构造&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext csContext = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSContext(uri,appName);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; SaveContextToStore(csContext);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; csContext;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;那么在那些关键的地方执行了CSContext的实例化呢？&lt;/div&gt;
&lt;div&gt;分析用户验证的时候，了解到CSHttpModule有对于整个CS应用程序的事件处理挂接，其中&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;application.BeginRequest += &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventHandler(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Application_BeginRequest);&lt;/span&gt;对应的挂接函数是这样的：&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Application_BeginRequest(Object source, EventArgs e) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpApplication application = (HttpApplication)source;&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext context = application.Context;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (context.Request.RawUrl.IndexOfAny(&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;char&lt;/span&gt;[] {&amp;#39;&amp;lt;&amp;#39;, &amp;#39;&amp;gt;&amp;#39;, &amp;#39;\&amp;#39;&amp;#39;, &amp;#39;&amp;quot;&amp;#39;}) != -1)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {//在urlrewrite之前进行url的编码转换工作&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; context.Response.Redirect(context.Request.RawUrl.Replace(&amp;quot;&amp;lt;&amp;quot;, &amp;quot;%3c&amp;quot;).Replace(&amp;quot;&amp;gt;&amp;quot;, &amp;quot;%3e&amp;quot;).Replace(&amp;quot;\&amp;#39;&amp;quot;, &amp;quot;%27&amp;quot;).Replace(&amp;quot;\&amp;quot;&amp;quot;, &amp;quot;%22&amp;quot;));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSConfiguration config = CSConfiguration.GetConfig();//获得当前配置&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// 如果是installer那么就终止当前执行&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (config.AppLocation.CurrentApplicationType == ApplicationType.Installer)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CheckWWWStatus(config,context);&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CheckSSL(config.SSL,context); &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext.Create(context, &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; UrlReWriterDelegate(ReWriteUrl));//此处进行了含有Url重写的指代的CsContext构造&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;CSContext.Create(context, &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; UrlReWriterDelegate(ReWriteUrl));&lt;/span&gt;会执行特定的指代函数&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;private&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;bool&lt;/span&gt; ReWriteUrl(HttpContext context)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UrlReWriteProvider urlProvider = UrlReWriteProvider.Instance();//provider模式，幸好我们之前已经分析了，不过&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; path = context.Request.Path;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; newPath = UrlReWriteProvider.Instance().GetRewrittenUrl(path,context.Request.Url.Query);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(newPath != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; qs = &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;int&lt;/span&gt; index = newPath.IndexOf(&amp;#39;?&amp;#39;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (index &amp;gt;= 0)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; qs = (index &amp;lt; (newPath.Length - 1)) ? newPath.Substring(index + 1) : &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Empty;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newPath = newPath.Substring(0, index);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; urlProvider.RewriteUrl(context, newPath, qs); &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; newPath != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;UrlReWriteProvider是一个抽象类，类似前面分析的Provider模式，但是具体的在我收到的CS版本中并没有CommunityServer.config中提供具体的provder组件，而是如下：&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;static&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; UrlReWriteProvider()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type defaultProviderType = &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (Environment.Version.Major &amp;gt;= 2)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; defaultProviderType = Type.GetType(&amp;quot;CommunityServer.Components.CSASPNET20UrlReWriteProvider, CommunityServer.Components&amp;quot;);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(defaultProviderType == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; defaultProviderType = &lt;span style="COLOR:blue;"&gt;typeof&lt;/span&gt;(CSUrlReWriter); &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; _instance = SingletonProviderHelper.LoadInstance(&amp;quot;UrlReWriteProvider&amp;quot;, defaultProviderType) &lt;span style="COLOR:blue;"&gt;as&lt;/span&gt; UrlReWriteProvider;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;"&gt;如果是asp.net2.0以上版本，则使用CSASPNET20UrlReWriteProvider.cs中指定的UrlReriter来实现；如果是1.X的版本那么就读取provider配置节中UrlReWriteProvider指定的组件；但是由于communityServer.config并不存在指定的 UrlReWriteProvider 所以就直接使用 defaultProviderType = typeof(CSUrlReWriter);来替代。通常，我们如果期望某个组件可以被替换，但是实际运行又必不可少，我们可以给他弄一个缺省的组件，实现基本的功能，如果运行时实际部署没有指定个性化版本的组件，那么我们就是用内置的（如此处的CSUrlReWriter）来实现基本的运行细节。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;static&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; CSUrlReWriter()&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReWriteFilter = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; Regex(SiteUrls.Instance().LocationFilter, RegexOptions.IgnoreCase|RegexOptions.Compiled);&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;CSUrlReWriter通过SiteUrls的实例获得了LocationFilter，而LocationFilter的数据来源自我们在web根目录下指定的 SiteUrls.config &lt;/div&gt;
&lt;div align="left"&gt;对于全部url，会尝试正则式匹配，如果匹配，那么获得 所谓 Location对象，然后利用此对象的ReWriteUrl 方法获得新的Url&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;virtual&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; ReWriteUrl(&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; path, &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; queryString)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; newPath = &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Count &amp;gt; 0)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;foreach&lt;/span&gt;(ReWrittenUrl url &lt;span style="COLOR:blue;"&gt;in&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(url.IsMatch(path))&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; newPath = url.Convert(path,queryString);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext.Current.RewrittenUrlName = url.Name;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; newPath;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;"&gt;这样一个URL会经过UrlRewrite的指代获得转换（如果匹配的话）得到一个新的经过重写的URL。注意，asp.net1.1和asp.net2.0由于执行模式的改变，所以二者在重写的实现上是不同的（至于细节又需要一大篇幅了，在此就不花开两朵了）。&lt;/div&gt;
&lt;div&gt;通过在HttpModual中利用HttpContext构造CSContext并利用缺省的&lt;span style="FONT-SIZE:9pt;"&gt;UrlReWriteProvider（&lt;/span&gt;CSUrlReWriter&lt;span style="FONT-SIZE:9pt;"&gt;）读取&lt;/span&gt;SiteUrls.config中的数据，获得Url的重写规则，并替换得到新的Url，最后还是使用asp.net框架提供的API context.RewritePath(path, null, queryString);来执行最终的Url。&lt;/div&gt;
&lt;div&gt;总结下，通过分析url重写的逻辑我们大致可了解到：&lt;/div&gt;
&lt;div style="MARGIN-LEFT:18pt;TEXT-INDENT:-18pt;"&gt;1、&amp;nbsp;可以替换定制，利用provider模式实现的&lt;/div&gt;
&lt;div style="MARGIN-LEFT:18pt;TEXT-INDENT:-18pt;"&gt;2、&amp;nbsp;可以直接手动修改 SiteUrls.config中的数据，实现映射URL转换。&lt;/div&gt;
&lt;div style="MARGIN-LEFT:18pt;TEXT-INDENT:-18pt;"&gt;3、&amp;nbsp;正则式是高效的重写逻辑工具&lt;/div&gt;
&lt;div style="MARGIN-LEFT:18pt;TEXT-INDENT:-18pt;"&gt;4、&amp;nbsp;区分asp.net1.1和2.0的url重写的功能的不同实现方式&lt;/div&gt;
&lt;div&gt;5、CSHttpModule基本上是Http请求的可控执行起点，无论是验证的身份确立还是Url重写都在此挂接，感谢asp.net框架的设计，允许我们安全有序的操控Http请求执行上下文。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;
&lt;div&gt;&lt;span&gt;(本文转自杨山河于CSDN的文章. 原文请见 http://blog.csdn.net/shanhe/archive/2007/10/06/1812862.aspx)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://communityserver.cn/aggbug.aspx?PostID=65" width="1" height="1"&gt;</content><author><name>cutesong</name><uri>http://communityserver.cn/members/cutesong/default.aspx</uri></author><category term="CS研究系列文章" scheme="http://communityserver.cn/blogs/shanhe/archive/tags/CS_1478767AFB7C17528765E07A_/default.aspx" /></entry><entry><title>分享 Community Server 系列之四: Authentication</title><link rel="alternate" type="text/html" href="/blogs/shanhe/archive/2008/01/08/community-server-authentication.aspx" /><id>/blogs/shanhe/archive/2008/01/08/community-server-authentication.aspx</id><published>2008-01-08T21:22:00Z</published><updated>2008-01-08T21:22:00Z</updated><content type="html">&lt;p&gt;CommunityServer的身份鉴别&lt;/p&gt;
&lt;div&gt;任何交互系统，都要考虑身份鉴别方式，CS作为开源的社区系统项目，必然要涉及到同其他现有或者扩展系统的兼容性，那么就必须研究CS的身份验证体系细节，也总结出如何扩展此系统。&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;要处理身份验证，入口应该是系统的登录部分。CS的web工程里有一个login.aspx文件，是处理登录的。该页面只有一个CS:Login控件，这是个继承自 &lt;span style="FONT-SIZE:9pt;"&gt;SecureTemplatedWebControl 的控件类，大致我们可以看到登录细节在登录按钮的click事件处理：&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; LoginButton_Click (Object sender, EventArgs e) {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User userToLogin = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; User();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// Save in cookie auto login user&amp;#39;s preference&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// only if it wasn&amp;#39;t previously set or the cookie value differs from&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// login&amp;#39;s autologin checkbox status.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; AutoLoginCookie alCookie = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; AutoLoginCookie();&amp;nbsp;&amp;nbsp; //设定如果控件选择了允许自动登录的检查框那么就进行处理确保存在一个记录该设置的Cookie&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (!alCookie.HasValue ||&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (alCookie.HasValue &amp;amp;&amp;amp; (alCookie.GetValue() != autoLogin.Checked))) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alCookie.Write( autoLogin.Checked );&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (!Page.IsValid)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userToLogin.Username = username.Text;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userToLogin.Password = password.Text;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LoginUserStatus loginStatus = Users.ValidUser(userToLogin); &lt;span style="COLOR:green;"&gt;//验证用户的登陆状态&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessLoginRequest(userToLogin, loginStatus, autoLogin.Checked);//检查登录效果，根据登录状态来进行后续处理&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;Users 看来是一个关于User对象操作的逻辑类，通过静态方法提供对于User类型的用户API。&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;public&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;static&lt;/span&gt; LoginUserStatus ValidUser(User user) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext context = CSContext.Current;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//取得当前环境对象,单例模式?&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(user.Password ==&lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; user.Password =&amp;quot;&amp;quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(!MemberRoleProfileProvider.Instance().Members.ValidateUser(user.Username,user.Password)) &lt;span style="COLOR:green;"&gt;//通过provider方式获得关于会员资格验证的组件并进行实例化，调用其中的&lt;/span&gt;Members.ValidateUser函数进行用户名、口令的值对判断，结果当前username/password&lt;span style="COLOR:green;"&gt;验证失败&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventLogEntry entry = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventLogEntry();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entry.Category = &amp;quot;Security&amp;quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entry.EventID = 600;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entry.SettingsID = context.SettingsID;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entry.EventType = EventType.Warning;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; entry.Message = &amp;quot;Failed login for &amp;quot; + user.Username;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; EventLogs.Write(entry); //书写事件&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; LoginUserStatus.InvalidCredentials;&amp;nbsp;//返回登录错误的代码&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果运行到这里，表示用户名、密码验证通过！&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; User userLookup = Users.FindUserByUsername( user.Username );&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (userLookup == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//没找到用户？ &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; LoginUserStatus.InvalidCredentials;&amp;nbsp;//返回告诉当前失败原因&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(!userLookup.Member.IsApproved)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//membership没有审核通过？&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; LoginUserStatus.AccountPending;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//返回账号阻塞状态&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//下面来检查帐号的登录状态，因为即使通过身份验证，也许帐号被阻赛，需要在检查这类问题是否存在，系统应当不允许重复的username&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (!context.SiteSettings.EnableBannedUsersToLogin &amp;amp;&amp;amp;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userLookup.IsBanned &amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DateTime.Now &amp;lt;= userLookup.BannedUntil) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {//3种情况：是否允许用户锁定仍可登陆 用户是否锁定 锁定时间是否已经过去了 &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; LoginUserStatus.AccountBanned;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//账号锁定？&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// LN 5/21/04: Update user to DB if ban expired&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (userLookup.IsBanned &amp;amp;&amp;amp;&amp;nbsp;DateTime.Now &amp;gt; userLookup.BannedUntil) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//锁定期更新&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userLookup.AccountStatus = UserAccountStatus.Approved;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userLookup.BannedUntil = DateTime.Now;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Users.UpdateUser(userLookup);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (userLookup.AccountStatus == UserAccountStatus.ApprovalPending) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;span style="COLOR:green;"&gt;// 未被审核通过的帐号 或者等待审核的状态的帐号&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; LoginUserStatus.AccountPending;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (userLookup.AccountStatus == UserAccountStatus.Disapproved) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&lt;span style="COLOR:green;"&gt;// 冻结的帐号&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; LoginUserStatus.AccountDisapproved;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:54pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:green;"&gt;//执行到此，该帐号正常&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:54pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;context.User = userLookup;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//设定当前用户到context中&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(context.IsWebRequest)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RemoveAnonymousTracking(context.Context,context.SiteSettings.AnonymousCookieName);&lt;span style="COLOR:green;"&gt;//去掉对匿名状态的跟踪 当前是明确的登录用户&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//allow others to take action here&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSEvents.UserValidated(userLookup);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//纪录登陆状态 成功&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//附加的diggsvc身份插入代码&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //此处可以进行正常登录的增补行为&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt; LoginUserStatus.Success;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;MemberRoleProfileProvider 也是一个重要的provider,登记在 communityServer.config中,&lt;/div&gt;
&lt;div align="left"&gt;&amp;lt;add &lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; name = &amp;quot;MemberRolProfileProvider&amp;quot;&lt;/span&gt;¾&lt;/div&gt;
&lt;div align="left"&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; type = &amp;quot;CommunityServer.MemberRole.CSMemberRoleProfileProvider, CommunityServer.MemberRole&amp;quot;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; /&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;那么我们查找具体的CommunityServer.MemberRole.CSMemberRoleProfileProvider在 ，&lt;a class="" href="http://www.telligent.com/" target="_blank"&gt;Telligent Systems&lt;/a&gt; 的非开源部分，不过通过 &lt;span&gt;Reflector &lt;/span&gt;工具查看，似乎只是封装了微软的membership组件而已，并且最终通过MS的membership类的接口提供验证判断（返回boolean值）。&lt;/div&gt;
&lt;div&gt;如果返回通过帐号后，则进入 &lt;span&gt;ProcessLoginRequest &lt;/span&gt;函数处理登录成功后的工作。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;protected&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; ProcessLoginRequest(User userToLogin, LoginUserStatus loginStatus, &lt;span style="COLOR:blue;"&gt;bool&lt;/span&gt; autoLoginUser)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;bool&lt;/span&gt; enableBannedUsersToLogin = csContext.SiteSettings.EnableBannedUsersToLogin;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; redirectUrl = &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果当前用户帐号OK 或者虽然是被禁止的帐号，但是当前设置允许被禁止帐号登录&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (loginStatus == LoginUserStatus.Success || (enableBannedUsersToLogin &amp;amp;&amp;amp; loginStatus == LoginUserStatus.AccountBanned))&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:54pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;{&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:54pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;//如果站点设置不允许登录 而且当前帐号又不是管理员，那么当然要抛出例外错误&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (!csContext.SiteSettings.AllowLogin &amp;amp;&amp;amp; !userToLogin.IsAdministrator)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;throw&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSException(CSExceptionType.UserLoginDisabled);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div style="MARGIN-LEFT:63pt;TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;//正常登录状态，那么就要设定登录cookie&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpCookie formsAuthCookie;&lt;/span&gt;&lt;/div&gt;
&lt;div style="MARGIN-LEFT:63pt;TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;//获得身份验证cookie&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; formsAuthCookie = FormsAuthentication.GetAuthCookie(userToLogin.Username, autoLoginUser);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // FormsAuthentication是系统类。在用户通过身份验证后，Forms 身份验证即会在 Cookie 或 URL 中维护一个身份验证票证，这样已通过身份验证的用户就无需在每次请求时都提供凭据了。&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; formsAuthCookie = AlterAuthCookie(formsAuthCookie);// AlterAuthCookie未实现&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UserCookie userCookie = csContext.User.GetUserCookie();//获得一个UserCookie实例&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; userCookie.WriteCookie(formsAuthCookie, 30, autoLoginUser); //然后写入刚才的票据Cookie&lt;/span&gt;&lt;/div&gt;
&lt;div style="MARGIN-LEFT:42pt;TEXT-INDENT:21pt;" align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&lt;span style="COLOR:green;"&gt;//处理推荐注册的善后工作&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (invitation != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UserInvitations.Accept(invitation, csContext.User);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// 如果含有&lt;/span&gt;ReturnUrl那么设定注册后的返回Url&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (!Globals.IsNullorEmpty(csContext.ReturnUrl))&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redirectUrl = csContext.ReturnUrl;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// 确定最后转入Url&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; ((redirectUrl == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; (ReferralLink != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;) &amp;amp;&amp;amp; (ReferralLink.Trim() != &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Empty))&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redirectUrl = ReferralLink;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (Globals.IsNullorEmpty(redirectUrl)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || (redirectUrl.IndexOf(&amp;quot;MessageID&amp;quot;) != -1)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || (redirectUrl.IndexOf(Globals.GetSiteUrls().Logout) != -1)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || (redirectUrl.IndexOf(&amp;quot;ChangePassword&amp;quot;) != -1)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; || (redirectUrl.IndexOf(&amp;quot;EmailForgottenPassword&amp;quot;) != -1))&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redirectUrl = Globals.GetSiteUrls().Home;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (invitation != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redirectUrl = Globals.GetSiteUrls().Message(CSExceptionType.UserInvitationAccepted);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeaveSecureConnection(redirectUrl);//安全转入到最后确定的Url&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (loginStatus == LoginUserStatus.InvalidCredentials)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// 如果身份验证失败&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeaveSecureConnection(Globals.GetSiteUrls().Message(CSExceptionType.UserInvalidCredentials));&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (loginStatus == LoginUserStatus.AccountPending)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// 如果帐号未被审核&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeaveSecureConnection(Globals.GetSiteUrls().Message(CSExceptionType.UserAccountPending));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (loginStatus == LoginUserStatus.AccountDisapproved)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// 帐号被枪毙&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeaveSecureConnection(Globals.GetSiteUrls().Message(CSExceptionType.UserAccountDisapproved));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (loginStatus == LoginUserStatus.UnknownError)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{//未知错误&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;throw&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSException(CSExceptionType.UserUnknownLoginError);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (!enableBannedUsersToLogin &amp;amp;&amp;amp; loginStatus == LoginUserStatus.AccountBanned)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;span style="COLOR:green;"&gt;//帐号阻塞&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; LeaveSecureConnection(Globals.GetSiteUrls().Message(CSExceptionType.UserAccountBanned));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;以上是登录时候的验证，可以看到验证通过后会放置一个安全存根到Cookie，随后的请求应当会携带这些Cookie，并经过获得身份鉴别。CS的身份鉴别还是自己进行了处理，通过web.config中的设定，挂接了相应的HttpModual:&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:maroon;"&gt;httpModules&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:maroon;"&gt;add&lt;/span&gt;&lt;span style="COLOR:red;"&gt;name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;CommunityServer&amp;quot;&lt;/span&gt;&lt;span style="COLOR:red;"&gt;type&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;CommunityServer.CSHttpModule, CommunityServer.Components&amp;quot;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:maroon;"&gt;add&lt;/span&gt;&lt;span style="COLOR:red;"&gt;name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;CSProfile&amp;quot;&lt;/span&gt;&lt;span style="COLOR:red;"&gt;type&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;Microsoft.ScalableHosting.Profile.ProfileModule, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562&amp;quot;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR:maroon;"&gt;add&lt;/span&gt;&lt;span style="COLOR:red;"&gt;name&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;CSRoleManager&amp;quot;&lt;/span&gt;&lt;span style="COLOR:red;"&gt;type&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;=&amp;quot;Microsoft.ScalableHosting.Security.RoleManagerModule, MemberRole, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7c773fb104e7562&amp;quot;&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR:maroon;"&gt;httpModules&lt;/span&gt;&lt;span style="COLOR:blue;"&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;这几个&lt;span style="FONT-SIZE:9pt;COLOR:maroon;"&gt;httpModule&lt;/span&gt;都有同当前身份验证有关系，我们逐个分析。&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;CommunityServer.CSHttpModule &lt;/span&gt;在Init方法中挂接了多个事件：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;public&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Init(HttpApplication application) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// Wire-up application events&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.BeginRequest += &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventHandler(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Application_BeginRequest);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.BeginRequest +=&lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventHandler(cs_beginrequest);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.AuthenticateRequest += &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventHandler(Application_AuthenticateRequest);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.Error += &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventHandler(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Application_OnError);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.AuthorizeRequest += &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventHandler(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Application_AuthorizeRequest);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; application.EndRequest += &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; EventHandler(&lt;span style="COLOR:blue;"&gt;this&lt;/span&gt;.Application_EndRequest);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;与身份相关的全局事件是：&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;application.AuthenticateRequest&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;application.AuthorizeRequest&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;application.EndRequest&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;来看看其中代码：&lt;/div&gt;
&lt;div&gt;事件发出信号表示配置的身份验证机制已对当前请求进行了身份验证。预订 AuthenticateRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证。不过，似乎对于开源版本以下涉及到的各个模块都没有提供，我想那应该是收费版本才提供的DLL吧。希望有付费用户能够提供相关补充资料。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Application_AuthenticateRequest(Object source, EventArgs e) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;span style="COLOR:green;"&gt;//鉴别用户身份的事件 Authenticate 利用外挂模块的方式，通过外挂接口来进行身份验证&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext context = HttpContext.Current;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Provider p = &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ExtensionModule module = &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// If the installer is making the request terminate early&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (CSConfiguration.GetConfig().AppLocation.CurrentApplicationType == ApplicationType.Installer) {//如果当前事件是Installer application事件，那么退出&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// Only continue if we have a valid context&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//还要去确保context存在&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (context == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;authenticationType = String.Empty;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//首先初始化身份验证类型&lt;/span&gt;String.Empty&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (context.User == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;span style="COLOR:green;"&gt;//上段的注释告诉我们 如果User为空，并不一定意味着我们没有进行身份验证，可能使通过定制的模块验证方式处理了验证，此时需要看看 customidentity 类别的验证是否已经实施&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = (Provider) CSConfiguration.GetConfig().Extensions[&amp;quot;CustomAuthentication&amp;quot;];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module = ExtensionModule.Instance(p);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(module != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //如果实例化验证provider模块成功&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; authenticationType = &amp;quot;customidentity&amp;quot;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; authenticationType = context.User.Identity.GetType().Name.ToLower();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//执行这段try catch之前已经确定了 authenticationType &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;try&lt;/span&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {//来进行相应的&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ProcessRequest&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;switch&lt;/span&gt;(authenticationType)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &amp;quot;passportidentity&amp;quot;:&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = (Provider) CSConfiguration.GetConfig().Extensions[&amp;quot;PassportAuthentication&amp;quot;];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module = ExtensionModule.Instance(p);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(module != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module.ProcessRequest();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;goto&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;default&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// Windows&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &amp;quot;windowsidentity&amp;quot;:&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = (Provider) CSConfiguration.GetConfig().Extensions[&amp;quot;WindowsAuthentication&amp;quot;];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module = ExtensionModule.Instance(p);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(module != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module.ProcessRequest();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;goto&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;default&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &amp;quot;formsidentity&amp;quot;:&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//目前大多数是这种验证，此时调用 CommunityServer.config中 extensionModules 部分的模块验证&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = (Provider) CSConfiguration.GetConfig().Extensions[&amp;quot;FormsAuthentication&amp;quot;];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module = ExtensionModule.Instance(p);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(module != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module.ProcessRequest(); &lt;span style="COLOR:green;"&gt;//此处进行了身份的验证处理，应该包括了cookie的设定和加密揭秘&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;goto&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;default&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// Custom&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;case&lt;/span&gt; &amp;quot;customidentity&amp;quot;:&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = (Provider) CSConfiguration.GetConfig().Extensions[&amp;quot;CustomAuthentication&amp;quot;];&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module = ExtensionModule.Instance(p);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt;(module != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; module.ProcessRequest();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;else&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;goto&lt;/span&gt; &lt;span style="COLOR:blue;"&gt;default&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;default&lt;/span&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSContext.Current.UserName = context.User.Identity.Name;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;break&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;catch&lt;/span&gt;( Exception ex ) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSException forumEx = &lt;span style="COLOR:blue;"&gt;new&lt;/span&gt; CSException( CSExceptionType.UnknownError, &amp;quot;Error in AuthenticateRequest&amp;quot;, ex );&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; forumEx.Log();&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&amp;nbsp;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;throw&lt;/span&gt; forumEx;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div style="TEXT-INDENT:21pt;"&gt;以上都是通过配置，然后利用provider模式获得具体的功能组件。不过，当前这块都是属于 &lt;span&gt;&lt;a class="" href="http://www.telligent.com/" target="_blank"&gt;&lt;span style="COLOR:windowtext;"&gt;Telligent Systems&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;的定制DLL提供，并且似乎没有开源，要分析只有求助于 &lt;span&gt;Reflector&lt;/span&gt;工具了。&lt;/div&gt;
&lt;div&gt;我得到的CS版本中，存在一个关于验证的节：&lt;/div&gt;
&lt;div&gt;该事件表示 ASP.NET 已对当前请求进行了授权。预订 AuthorizeRequest 事件可确保在处理附加的模块或事件处理程序之前对请求进行身份验证和授权。&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Application_AuthorizeRequest (Object source, EventArgs e) {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (CSConfiguration.GetConfig().AppLocation.CurrentApplicationType == ApplicationType.Installer)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;//如果是installer则不进行验证&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;return&lt;/span&gt;;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpApplication application = (HttpApplication)source;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext context = application.Context;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;CSContext csContext = CSContext.Current;&amp;nbsp;&amp;nbsp; //获得CSContext，当前执行上下文的封装对象&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; CSEvents.UserKnown(csContext.User);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ValidateApplicationStatus(csContext);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //验证当前执行上下文&amp;nbsp;如果上下文无法建立，表名身份验证出问题了，会进入到不同的错误处理。暂不深入分析，只是知道是进行上下文验证即可。&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (context.Request.IsAuthenticated) {//如果通过了asp.net框架的验证&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; username = context.User.Identity.Name;&amp;nbsp;&amp;nbsp; //&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (username != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;) {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;[] roles = CommunityServer.Components.Roles.GetUserRoleNames(username);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; //设定当前用户的所属组别&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (roles != &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt; &amp;amp;&amp;amp; roles.Length &amp;gt; 0) {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; csContext.RolesCacheKey = &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt;.Join(&amp;quot;,&amp;quot;,roles);&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;很多时候，需要验证当前用户的分组，那么在通过验证，取得当前用户的身份情况下，需要通过CommunityServer.Components.Roles获得当前用户的分组。&lt;/div&gt;
&lt;div&gt;结束验证的时候，查看当前执行上下文的状态：&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;COLOR:blue;"&gt;private&lt;/span&gt;&lt;span style="FONT-SIZE:9pt;"&gt; &lt;span style="COLOR:blue;"&gt;void&lt;/span&gt; Application_EndRequest (Object source, EventArgs e) &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; HttpContext context = HttpContext.Current;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:green;"&gt;// HTTP错误401.1-未经授权:访问由于凭据无效被拒绝&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;if&lt;/span&gt; (authenticationType == &amp;quot;customidentity&amp;quot; &amp;amp;&amp;amp; context.Response.StatusCode == 401 &amp;amp;&amp;amp; context.Request.QueryString[&amp;quot;ReturnUrl&amp;quot;] == &lt;span style="COLOR:blue;"&gt;null&lt;/span&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; { //计算得到ReturnUrl&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="COLOR:blue;"&gt;string&lt;/span&gt; redirectUrl = String.Empty;&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; redirectUrl = SiteUrls.FormatUrlWithParameters(SiteUrls.Instance().UrlData.Paths[&amp;quot;login_clean&amp;quot;], &lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;quot;ReturnUrl=&amp;quot; + Globals.UrlEncode(context.Request.Url.ToString()));&lt;/span&gt;&lt;/div&gt;
&lt;div align="left"&gt;&lt;span style="FONT-SIZE:9pt;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbs