ASP.NET开发经验(4) — 一种简便地同时使用匿名与集成 Windows 验证的方法

相对来说,集成 Windows 验证是 ASP.NET 提供的一种安全性较高的验证方式,不用考虑被 Sniffer、不用去创建登录页面、不用去考虑登录失败次数限制、更重要的是,不用在应用程序中提供用户管理的功能,以及如何保护数据库中的用户名和密码。

经常会碰到这种应用场景:用户对一些普通功能可以匿名访问,对另外一些高级/管理功能,则需要登录后才能使用,很多人的做法就是将普通功能的页面放置在一个目录中,而高级/管理功能的页面则放在另外一个目录中,使用不同的 Web.Config 设置(<authorization> 的 <allow/> 或 <deny/>节)来控制,这样可能带来的一个问题就是:实现同样功能的页面可能要被复制两份,分别部署在这些目录中。

如果全部页面只在一个目录中,有什么办法可以同时实现匿名和授权用户的访问呢?即如何在需要验证用户的时候,弹出那个集成验证的对话框。

如果是基于 Forms 验证,则只需要手动调用(链接)一个 Login.aspx 就可以解决这个问题,但对于 Windows 集成验证来说,仔细查看了一下 WindowsAuthenticationModule 类,似乎没有找到可以编程控制来弹出 Windows 集成验证的那个对话框的方法。

还是采取了一个土办法。

  • 原有页面目录中的 Web.Config 设置如下:

   <authorization>
        <allow users=”*” />
   </authorization>

  • 新建一个子目录,Web.Config 设置如下:

   <authorization>
        <deny users=”?” />
   </authorization>
  

  • 在子目录中创建一个简单的 Auth.aspx ,使其 Response.Redirect 到上级目录中的页面
  • 在原有页面中的适当位置,建立一个“Login”的链接,指向 Auth.aspx

这样就可以在原有页面中通过 User.Identity.Name 是否为空来检测用户是否登录,当然也可以在 Auth.aspx 中通过检查用户的 User.Identity.Name ,来进行一些其它的处理,如取出用户的权限、记录日志等。

估计还有更好的方法,探寻中 … …

不太好理解的Alternation Constructs

看到有人对.NET中正则表示式的Alternation Constructs不太理解,这里写个简单例子说明一下。

英语里说 “0 feet”(0英尺), “1 foot”(一英尺),”2 feet”(二英尺),”3 feet”(三英尺),…我们怎么来匹配这些字符串?

这个例子很简单,象 
 “^01 foot|[02-9] feet|[1-9]\d+ feet$”

 “^0
1 foot|(?:(?:[02-9]|[1-9]\d+) feet)$”

这样的表达式大概就行了。

下面用Alternation Constructs来演示一下。

1。 “^\d+ f(?(?<=\b0*1 f)oo|ee)t$”

在这里,(?<=\b01 f) is a zero-width positive lookbehind, (?(?<=\b01 f)oo|ee) 表示

假如前面3个字符是1 f的话(有可能有些前置的0),那么匹配oo,否则匹配ee

2。 “^((?<one>0*1)|[02-9]|\d{2,}) f(?(one)oo|ee)t$”

在前面我们尝试匹配1(有可能有些前置的0),假如1被匹配的话,表明第一部分(?<one>0*1)被captured了,group “one”就有了定义

在第二部分里

(?(one)oo|ee)

说,假如前面的group “one”被captured了,那么就匹配oo,否则匹配ee

这里是个测试编码

using System;
using System.Text.RegularExpressions;

class TestRegAC
{
  static void Main()
  {
 string[] slist = {“11 foot”, “01 feet”, “1 foot”, “1 feet”, “2 feet”, “3 foot”, “10 feet”, “100 foot”, “0 feet”, “001 foot”};
 Regex re = new Regex(@”^\d+ f(?(?<=\b0*1 f)oo|ee)t$”, RegexOptions.IgnoreCase);
 foreach (string s in slist)
 {
  Console.WriteLine(“{0} matches? {1}”, s, re.IsMatch(s));
 }

 Console.WriteLine();

 re = new Regex(@”^((?<one>0*1)|[02-9]|\d{2,}) f(?(one)oo|ee)t$”, RegexOptions.IgnoreCase);
 foreach (string s in slist)
 {
  Console.WriteLine(“{0} matches? {1}”, s, re.IsMatch(s));
 }
  }
}

同时参考

Manipulate Text With Regular Expressions

里面有个匹配25-09-2003后任一天的例子,很有意思

JoyReader For SmartPhone预览

看到mvm开发的财务管理软件,十分羡慕,可惜俺不是有钱人,而且一向对自己的财务粗心大意,所以只能动动代码的脑筋了。

正好前段时间,我的Moto手机寿终正寝了。有位同事非常心善,借我一个Dopod 515玩,于是也趁机搞起了SmartPhone开发。但是开发哪种项目,一直是让我头疼的问题。后来,在上班的公共汽车上,终于想明白了,开发一个博客堂的阅读程序。

毕竟,在目前这个阶段,使用SmartPhone上的IE来上网还是一个奢望。毕竟屏幕太小,长长的滚动条会让手指累死。但既然我们可以使用SmartPhone查看短信,那么把博客堂的文章做成类似于短信的形式,不就可以了吗?

但是基于.NET Compact Framework的开发还不算真正的成熟,很多东西还需要自己努力,当然也极具挑战性。正因为此,我发现自己已经爱上了.NET Compact Framework的开发。

JoyReader主要实现的功能如下:

(1)实现与RSS,RDF,ATOM源进行智能同步,即可以设置自动同步时间间隔,也可以手工同步;如果未发现更新,将会中止同步,以便节省流量;

(2)查看文章列表及文章内容,此部分自己编写了控件,.NET Framework竟然不提供带有滚动条的Label,郁闷,那个ListView是使用MSDN上的一个示例完全重写的;

参考资料:

1.OpenCF: http://www.opennetcf.org/

2.PocketPC Develop Network: http://www.pocketpcdn.com/

3.MSDN Windows Mobile: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/windowsmobile.asp

 

 

微创短信开发平台

记得我上次提到的新浪短信平台吗?通过上次的推荐,已经有很多朋友在上面进行开发了,而且我也在Google上搜到很多其它语言的作者,写的相关的调用文章。

在前几天,做另外一个项目的时候,突然发现这个Web Service失效了,短信发不出去了。昨天卢彦老弟带着哭腔给我打电话,说他的项目中也使用了这个Web Service,现在客户方已经打上门来了,我当时只能表示歉意。

还好,新浪的短信服务平台倒掉了,我们还有微创短信开发平台。现在还是开发测试阶段,但已经可以使用了。你可以像以前那样使用Web Service进行调用。如果你使用的开发语言对Web Service不那么支持的话,那么你可以使用URL传参方式调用,感觉上比新浪的那个平台方便多了。

好用是好用,但是你需要付出一定的费用:

1、人民币2,500元的系统设置费。(目前属于推广阶段,免除该费用

        2、第一次人民币3,000元的预付费。每发送一条短消息0.10元,从预付费中扣除,该预付费需要在1年内用完。

        3、以后的预付费可以按照实际需要数增加。

从Web Service的发展大潮中,找到一个合适的点子,赚自己想赚的钱,同时也方便更多的开发者,我想以后Web Service还是会大行其道的:)

Gates的业余爱好

最近,Bill Gates邀请微软新实习生到他家野餐,这好像是一年一度的事情。在网上读到了Jeff Maurone详述的这次经历(12),提到豪华的房子, Gates的平易近人,与女儿在一起的场面

猜猜他的业余爱好是什么?Medicine 和 bio-tech!

这里是一段Bill Gates的话

“I’m a technologist. My brain is wired to think about software and how it should work. It’s kind of my one shot. I’m not a businessman and most times I don’t even know what it means to be a businessman. If you’ve got this one thing you do that is your passion, that’s really the only thing at which you have a shot of being world class.”

ASP.NET 2.0中的自定义表示式

在手头的项目里,不少动态网页里需要包含静态的XML文件,内含格式化的内容。用XML文件的原因是,内容/设计组的人员好编辑。我们是在编码里加了PlaceHolder或LiteralControl,读取这些文件,也许会做些过滤,然后把内容输出到网页里去。也可以做成Server Control,但因为涉及别的因素,没有这么做。

正好读到Jeff Prosise的blog里提到ASP.NET 2.0中的自定义表示式,感觉很有意思。ASP.NET QuickStart Tutorial的新版里提到了“Writing Expression Handlers”,但没编码可参考。在GOOGLE上查了一下,Marco Bellinaso通过Reflector琢磨出了怎么写Custom Expression Handlers,而且写了个跟我们的目的类似的Handler。但很可惜,我们现在还不能用ASP.NET 2.0

XPath+XSLT

看到了LostInet的Extension Object帖子,正好最近在写跟XPath有关的东西,从XML MVP Daniel Cazzulino处学到了不少东西,顺便看到MSDN上一些非常有用的信息,了解到可以通过XsltContext / IXsltContextFunction / IXsltContextVariable来实现设置自己的函数与参数。KB里有篇综述性文章:

INFO: Roadmap for Executing XSLT Transformations in .NET Applications

还有一篇提到XSLT转换性能的文章:

INFO: Performance of XSLT Transformations in the .NET Framework

里面提到了一些问题

1.用XmlDataDocument做转换慢,应该用XPathDocument
2.用到preceding-sibling时,通过XmlDocument转换大文件时会causes 100 percent CPU utilization
3.用xsl:key时转换会很慢
4.用Inline Script Blocks时,生成的Managed Assemblies不能正确地释放