Step1帐户登录系统(6.使用OpenID登录网站)

        在我昨天的博客之中,我我介绍了我在帐户登录系统中对Yahoo的BBAuth的登录的支持过程,上面那篇文章的代码虽然很简单,文章也不长,实际上却是我研究的最深刻的一种类型,也是我对BBAuth的研究最终让我决定将这个系统全部开源。,今天,我要讲一下,OpenID的实现,下一篇应该是讲如何支持校内网的登录,再后面我可能简单的讲讲Oauth登录(如果我确实能够研究清楚地话),有网友曾经问到什么时候会提供整个代码的下载,我并不是不提供,而是我觉得代码还非常不完善,我在网站上提供代码的下载肯定要在我每一个支持的登录类型都介绍完毕之后,当时一定要在元旦之前,如果确实在此之前需要参考一下我的代码,可以直接与我联系,我随时可以提供所有的源码。

        讲到OpenID,想来很多读者都有一定的了解,没错,这是一个开放的协议,目的就是让用户能够在所有的网站使用一个账号和密码登录,这一点,和本系统的目的是不同的,因为本系统是比较自私的,希望是让所有的用户都可以使用自己已经有的帐户和密码登录,而OpenID则是希望所有的用户在所有的网站都可以使用一个账号和密码登录,当然要实现这个是比较难的,目前没有实现,但是不能不承认这是一个很有意义的事情,而本系统也不能不支持这种帐户的登录。

       关于OpenID的更多信息建议到OpenID的相关网站去看看,说老实话,这是我很看好的一个项目,如果感兴趣可以看看OpenID的相关网站

        OpenID的实现原理和本系统,和Google的AuthSub,Yahoo的BBAuth,Live的Account Server,包括我还没有介绍到的Oauth,实现的原理都是一样的,都是采用一种可信的方式在用户和Web应用程序之间建立交互,所不同的是,OpenID因为是要做到开放和能够到处兼容,所以有一些其它的考虑,至于具体有一些什么考虑,我能了解的是这样几点:

        1.采用URL作为账号,这样的话,就可以支持任意的网站,任何一个网站都可以提供OpenID了

        2.用户提供的URL之中,通过http或者html的Header来指定OpenID服务器的地址,甚至可以指定牛转向到另一个OpenID地址,这样可以确保用户可以使用自己喜欢的网址来作为登录帐号

         我知道的不比你多多少,我知道的也就是这些了,对于怎么才能支持OpenID登录,虽然我研究了很久,不过最后得出一个结论,还是使用公用的库吧,因为OpenID相对还是比较复杂的,要完整地支持还是挺难的;

        我采用的是ExtremeSwank的Dotnet OpenID2.0的库,这个库确实很好用,很快我就完成了对OpenID的支持,因为我对OpenID的了解实际上并不够,因此也不太合适对OpenID进行什么长篇大论,因此,我也就简单的提供OpenID的支持相关代码了:

        需要注意的是,以前我支持的多个类型都是只需要选择登录类型即可,而对于OpenID,因为必须先让用户输入登录帐号(URL),根据url地址才能够得到登录的转向地址,所以,必须先让用户输入帐号才能进行登录的转向。

        因为在登录界面根据URL的不同而不同,所以这次在本站也不再列出登录相关的截图,仅仅提供实现的代码:

 

ContractedBlock.gif ExpandedBlockStart.gif OpenidServer.js代码
 1    public class OpenidServer : BaseServer
 2ExpandedBlockStart.gifContractedBlock.gif    {
 3        private string urlIdentity=null,defaultNickName=null;
 4        //采用Web.Config之中的XML节点作为构造函数参数
 5        public OpenidServer(System.Xml.XmlNode node)
 6            : base(node)
 7ExpandedSubBlockStart.gifContractedSubBlock.gif        {
 8            for (int i = 0; i < node.Attributes.Count; i++)
 9ExpandedSubBlockStart.gifContractedSubBlock.gif            {
10                switch (node.Attributes[i].LocalName)
11ExpandedSubBlockStart.gifContractedSubBlock.gif                {
12                    case "urlIdentity"://如果指定了urlIdentity,就可以不让用户输入帐好了,就可以支持OpenID类型的网站类型登录了,例如指定为yahoo.com,则用户就可以直接支持Yahoo的登录了
13                        urlIdentity = node.Attributes[i].Value;
14                        break;
15                    case "defaultNickName"://指定默认的昵称
16                        defaultNickName = node.Attributes[i].Value;
17                        break;
18                }

19            }

20        }

21        public override string getLoginUrl()//返回登录地址
22ExpandedSubBlockStart.gifContractedSubBlock.gif        {
23            OpenIDConsumer openid = new OpenIDConsumer(new NameValueCollection(), nullnull);
24
25            SimpleRegistration sr = new SimpleRegistration(openid);
26            sr.AddRequiredFields(SimpleRegistrationFields.Nickname);//设置附加的字段列表
27
28            openid.ReturnURL = this.getHandleUrl();
29            openid.Identity = urlIdentity!=null?urlIdentity:HttpContext.Current.Request["openid_url"];
30            return openid.BeginAuth(falsefalse);//获得并返回登录地址
31        }

32        public override void parseHandle(HttpContext page)//回转内容处理函数
33ExpandedSubBlockStart.gifContractedSubBlock.gif        {
34            OpenIDConsumer openid = new OpenIDConsumer(page.Request.QueryString, nullnull);
35            switch (openid.RequestedMode)
36ExpandedSubBlockStart.gifContractedSubBlock.gif            {
37                case RequestedMode.IdResolution:
38                    if (openid.Validate())
39ExpandedSubBlockStart.gifContractedSubBlock.gif                    {
40                        OpenIDUser user = openid.RetrieveUser();
41                        string account=user.Identity;
42                        if (user.ExtensionData.ContainsKey(SimpleRegistrationFields.Email))
43ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
44                            account = user.ExtensionData[SimpleRegistrationFields.Email];
45                        }

46                        string nickName;//虽然设置了附加的字段类型,可是服务器未必支持,因此还是要判断该字段是不是存在
47                        if(user.ExtensionData.ContainsKey(SimpleRegistrationFields.Nickname))
48ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
49                            nickName=user.ExtensionData[SimpleRegistrationFields.Nickname];
50                        }

51                        else
52ExpandedSubBlockStart.gifContractedSubBlock.gif                        {
53                            nickName=defaultNickName!=null?defaultNickName:account;
54                        }

55                        AccountHelper.setUserInfo(account, nickName, this.name);
56                        AccountHelper.returnOpener();
57                        page.Response.End();
58                    }

59                    break;
60            }

61        }

62    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值