【 tulaoshi.com - ASP.NET 】
Hi, 现在我们暂时不谈Passport
小气的神2002.02.16 Article Type: In-Depth 难度等级:6/9 版本:1.27 在我写了那篇Passport你的网站之后,我发现自己犯了一个错误,从一开始。也许当时只是想表达自己对Passport的喜爱和接触之后还算美好的虚荣感受。我想在当时陶醉时,肯定刻意忽略了其它的某种因素。不然当计划正式开始使用它时,不会发现它突然带有了某种不确定性,甚至退后到测试的机器上也不能工作了;多次再去做和对着文档去想了又想,开始有些惭愧,因为我发现那篇文档几乎毫无用处,这将是一次名不其实表述,那么对于一个技术人员来说,这种感受是痛伤的,同时对他来说也将是个教训。 不过Passport的重要性丝毫不亚于它的复杂和繁琐,无法预知Microsoft将如何改善这种长距离的集中验证所带来的不确定“刺耳音符”,但在未来可以看到的体系和应用中,避而不见Passport,也意味着今后你在MS平台上要冒更多的风险。那么对于“是否需要接触Passport?”、“现在是否需要学习了解Passport?”这样问题的答案都应该是慎重的“应该”,放弃观望的态度将是一个好的开始。我们可以在接触学习中等待3.0版本的Passport,不过在没有更好的Demo,没有我们需要的Help文档的一段时间里,现在我们暂时不谈MS的Passport。它依然复杂得超出我们的理解,我们只能一点点去尝试和了解,做那些我们力所能及的事。最后欢迎回到这个脆弱而迷幻的世界,它依然充满失落和期待。 下面将是一个Passport的实现(我猜是最小的一个框架),它的最初是Nathan Smith (nathan_y_smith@hotmail.com )示范性的一个dotNET β2的版本,调试时我进行了一些小的改动(不少改进吧,但主框架没动),并且添加了一个简单的测试前端。在我升级到dotNET 1.0后,重新测试了它,所以它需要的环境可能是:Windows 2000 Server, MS SQL 2000 SP2 (中文或英文),dotNET SDK 1.0 , VS.NET RTM,IIS 5.0 SP, IE6 2813 数据结构: 设计两个数据库:PassportSvr , PassportClient PassportSvr:
PassportClient: 另外还有下面这些实现核心功能的存储过程: sp_registerUser sp_setUserInfo sp_setUserPassword sp_setUserStatus sp_purgeUser sp_setUserHomeService sp_validateUser sp_registerService sp_setServiceInfo sp_setServicePassword sp_setServiceStatus sp_purgeService sp_validateService 应用实现: 根据上面的数据结构实现了两个Web Services,一个作为整体的Services的管理接口,一个是提供给最终用户使用的Client Services接口。看得出来最终提供给用户使用的只有7个函数,当然开始时你可以在调试Services WebServices时测试一下RegisterService函数,它将建立一个Services,记下services_name和 services_password ,在实现Client的WebService的Global.cs中有这样应用: protected void Application_Start(Object sender, EventArgs e){ DataManager.InitManager(); Passport ppSvc = new Passport(); AppTicket = ppSvc.AuthenticateService("Passport","passport"); ppSvc=null;} 整个实现中有个与Passport相似的安全机制-Ticket,当用户通过验证之后获得一个AuthenticationTicket并产生一个Token,我认为这里是最有趣和最棒的部分,简单有效。 Ticket Structure public class AuthenticationTicket{ public AuthenticationTicket() { } public int Token; public int OwnerID; public double ExpirationDate; public double IssueDate; public string NickName; public string FirstName; public string LastName; } Token Generation Routine static private int GenerateToken(int systemID, string nickName, int passwordHash, double issueDate, double expirationDate){ int rtn; // our return value string s_token; // string concatenation of the objects // concatenate all of our values together. // note the use of hashing the password and the id, this // *should* help reduce the probability of attack s_token=systemID.GetHashCode().ToString() + nickName + passwordHash.GetHashCode().ToString() + issueDate.ToString() + expirationDate.ToString(); // get the hash of the concatenation and return it rtn=s_token.GetHashCode(); return rtn;} 好了解决了主要问题,后面的实现的就迎刃而解了,下面分别是两个Web Services暴露的功能函数。 public AuthenticationTicket AuthenticateServicepublic AuthenticationTicket AuthenticateUserpublic AuthenticationTicket CreateAccountpublic int Dis