asp写的openid登录方法

[ 2008-09-03 21:37:29 | 作者: fisker ]  编辑  删除
字体大小: | |
今天ftp上不去,回头把blog改下。

以前好像看到sipo说asp写openid有些不能解决的问题,我也没查openid的规范。
这个对付简单的登录还是没问题的,不过代码还没测试。

先放上来,有兴趣的可以看看
 <script language="JScript" runat="server">
/*
ASP Openid
by fisker
2008-9-3
*/
var alert=print=write=function(str){Response.Write(str);}
var openid = new fiskerOpenid();
var input=getInput();
if(input["openid.mode"]=="id_res"){
 var nickname = input["openid.sreg.nickname"];
 var email = input["openid.sreg.email"];
 var returnUrl=input["return"];
 returnUrl += returnUrl.indexOf("?")!=-1?"&":"?";
 returnUrl += "nickname="+nickname;
 returnUrl += "&email="+email;
 Response.Redirect(returnUrl);
}else{
 if(input["openid"]==""||input["return"]==""){
 Response.write("<sc"+"ript>");
 Response.write("alert(\"error\");");
 Response.write("window.history.forward(1);");
 Response.write("</sc"+"ript>");
 Response.end();
 }
 
 openid.url = input["openid"];
 openid.get();
}
function getInput(){
 var input=new Array();
 var e=new Enumerator(Request.QueryString);
 for (;!e.atEnd();e.moveNext()){
 x=e.item();
 input[String(x).toLowerCase()]=String(Request.QueryString(x));
 }
 e=new Enumerator(Request.Form);
 for (;!e.atEnd();e.moveNext()){
 x=e.item();
 input[String(x).toLowerCase()]=String(Request.Form(x));
 }
 return input;
}
function fiskerOpenid(){
 this.url="";
 this.server="";
 this.delegate="";
 this.user = null;
 this.trust_root="";
 this.return_to="";
 this.sreg_required="nickname,email";
 this.get = function(info){
 if(!this.init()){Response.write("error");return;}
 if(info!=undefined)this.sreg_required=info;
 var html=this.request(this.server,"openid.mode=associate&openid.assoc_type=HMAC-SHA1");
 if (html==""){Response.write("error");return;}
 var assoc_handle = "";
 var assoc_type = "";
 var expires_in = "";
 var mac_key = "";
 try{
 var re=new RegExp("assoc_handle:(.+)","ig");
 assoc_handle = re.exec(html)[1];
 var re=new RegExp("assoc_type:(.+)","ig");
 aassoc_type = re.exec(html)[1];
 var re=new RegExp("expires_in:(.+)","ig");
 expires_in = re.exec(html)[1];
 var re=new RegExp("mac_key:(.+)","ig");
 mac_key = re.exec(html)[1];
 delete re;
 }catch(e){}
 var url = this.server;
 url += url.indexOf("?")!=-1?"&":"?";
 url += "openid.mode="+Server.URLEncode("checkid_setup");
 url += "&openid.identity="+Server.URLEncode(this.delegate);
 url += "&openid.trust_root="+Server.URLEncode(this.trust_root);
 url += "&openid.return_to="+Server.URLEncode(this.return_to);
 url += "&openid.assoc_handle="+Server.URLEncode(assoc_handle);
 url += "&openid.sreg.required="+Server.URLEncode(this.sreg_required);
 Response.Redirect(url);
 }
 this.init = function(){
 if(!this.check()) return false;
 if(this.trust_root==""||this.return_to==""){
 var thisServer="";
 var thisUrl="";
 thisServer+=String(Request.serverVariables("https")).toLowerCase()=="off"?"http://":"http://";
 thisServer+=String(Request.serverVariables("server_name"));
 thisServer+=String(Request.serverVariables("server_port"))=="80"?"":":"+String(Request.ServerVariables("server_port"));
 thisUrl+=thisServer;
 thisUrl+=String(Request.serverVariables("URL"));
 thisUrl+=String(Request.QueryString)==""?"":"?"+String(Request.QueryString);
 this.trust_root=(this.trust_root==""?thisServer:this.trust_root);
 this.return_to=(this.return_to==""?thisUrl:this.return_to);
 }
 var html = this.request(this.url);
 if (html=="") return false;
 html=html.replace(/\'/ig,"\"");
 var re=new RegExp("<link(.*?)rel=\"(.*?)\"(.*?)href=\"(.*?)\"(.*?)>","ig");
 var arr=[];
 while ((arrMatch = re.exec(html)) != null){
 var index=arrMatch[2].toLowerCase();
 var value=arrMatch[4];
 if(index.indexOf(" ")){
 for(var j=0;j<index.split(" ").length;j++)arr[index.split(" ")[j]]=value;
 }else{
 arr[index]=value;
 }
 }
 delete re;
 if(arr["openid.server"]!=""){
 this.server=arr["openid.server"];
 }else{
 return false;
 }
 this.delegate = arr["openid.delegate"]==undefined?this.url:arr["openid.delegate"];
 return true;
 }
 this.check = function(){
 if (this.url=="") return false;
 if(this.url.indexOf("://")==-1) this.url="http://"+this.url;
 return true;
 }
 this.request = function(url,data){
 if (data == undefined)var data = null;
 var method = data ? 'POST' : 'GET';
 var html="";
 try{
 var xmlhttp=Server.CreateObject("MSXML2.ServerXMLHTTP.3.0");
 xmlhttp.open(method,url,false);
 xmlhttp.send(data);
 html = this.bytesToStr(xmlhttp.responseBody);
 delete xmlhttp;
 }catch(e){}
 return html;
 }
 this.bytesToStr = function(CodeBody){
 var objStream= Server.CreateObject("ado"+"db.stream") ;
 objStream.Type = 1 ;
 objStream.Mode =3 ;
 objStream.Open() ;
 objStream.Write(CodeBody);
 objStream.Position = 0 ;
 objStream.Type = 2 ;
 objStream.charset = "utf-8" ;
 var returnstr = objStream.ReadText;
 objStream.Close();
 delete objStream;
 return returnstr;
 }
}
</script>
评论Feed 评论Feed: http://ifisker.com/blog/feed.asp?q=comment&id=1143
UTF-8 Encoding 引用链接: loading...

这篇日志没有评论.

发表评论
表情图标
[smile][confused][cool][cry]
[eek][angry][wink][sweat]
[lol][stun][razz][redface]
[rolleyes][sad][yes][no]
[heart][star][music][idea]
UBB代码
转换链接
表情图标
悄悄话
用户名:   密码:   注册?
验证码* 请输入验证码