using System; using System.Collections.Generic; using System.Linq; using System.Web; using WeiSha.Common; using Song.ServiceInterfaces; using Song.Entities; using System.Reflection; using Song.Extend; namespace Song.Site.API { /// /// 来自其它网站的请求 /// public class SSO : IHttpHandler { string appid = WeiSha.Common.Request.QueryString["appid"].String; //appid string user = WeiSha.Common.Request.QueryString["user"].String; //账号 string name = WeiSha.Common.Request.QueryString["name"].UrlDecode; //用户名称 string pw = WeiSha.Common.Request.QueryString["pw"].String; //密码,md5加密 string domain = WeiSha.Common.Request.QueryString["domain"].UrlDecode; //来自请求的域名 string action = WeiSha.Common.Request.QueryString["action"].String.ToLower(); //动作,login登录,logout退出登录,verify校验密码是否正确,add新增用户 string ret = WeiSha.Common.Request.QueryString["return"].String; //返回类型,xml或json string goto_url = WeiSha.Common.Request.QueryString["goto"].UrlDecode; //成功后的跳转地址 public void ProcessRequest(HttpContext context) { SSO_State state = null; try { if (string.IsNullOrWhiteSpace(user)) throw new Exception("1.账号不得为空"); if (string.IsNullOrWhiteSpace(appid)) throw new Exception("2.APPID不得为空"); if (string.IsNullOrWhiteSpace(domain)) throw new Exception("3.请求域不得为空"); //接口是否存在或正确 Song.Entities.SingleSignOn entity = Business.Do().GetSingle(appid); if (entity == null) throw new Exception("2.接口对象不存在"); if (!entity.SSO_Domain.Equals(domain, StringComparison.CurrentCultureIgnoreCase)) throw new Exception("3.该请求来自的域不合法"); //通过验证,进入登录状态 Song.Entities.Accounts emp = Business.Do().IsAccountsExist(user); if (emp == null) { if (!"add".Equals(action, StringComparison.CurrentCultureIgnoreCase)) throw new Exception(string.Format("4.当前账号({0})不存在", user)); Song.Entities.Accounts tmp = new Entities.Accounts(); tmp.Ac_AccName = user; tmp.Ac_Name = name; tmp.Ac_IsPass = tmp.Ac_IsUse = true; Business.Do().AccountsAdd(tmp); LoginState.Accounts.Write(tmp); state = new SSO_State(true, 10, string.Format("新建账号({0})", user)); } else { if (!emp.Ac_IsPass || !emp.Ac_IsUse) throw new Exception(string.Format("5.当前账号({0})被禁用或未通过审核", user)); switch (action) { //退出登录 case "logout": LoginState.Accounts.Logout(); state = new SSO_State(true, 7, string.Format("当前账号({0})退出登录", user)); break; //验证密码 case "verify": Song.Entities.Accounts acc = Business.Do().AccountsLogin(emp.Ac_ID, pw, true); if (acc == null) throw new Exception(string.Format("8.当前账号({0})与密码不匹配", user)); state = new SSO_State(true, 9, string.Format("当前账号({0})与密码校验成功", user)); break; //登录 case "login": default: LoginState.Accounts.Write(emp); //登录成功 Business.Do().PointAdd4Login(emp, "协同站点登录", domain, ""); //增加登录积分 Business.Do().LogForLoginAdd(emp); state = new SSO_State(true, 6, string.Format("当前账号({0})登录成功", user)); break; } } } catch (Exception ex) { int s = 0; string msg = string.Empty; if (ex.Message.IndexOf(".") > 0) { string str = ex.Message.Substring(0, ex.Message.IndexOf(".")); int.TryParse(str, out s); msg = ex.Message.Substring(ex.Message.IndexOf(".")+1); } state = new SSO_State(false, s, msg); } //如果成功,且转向地址不为空,则跳转 if (state != null && state.success && !string.IsNullOrWhiteSpace(goto_url)) { context.Response.Redirect(goto_url); } else { string reslut = state.ToReturn(ret); context.Response.Write(reslut); context.Response.End(); } } public bool IsReusable { get { return false; } } } public class SSO_State { /// /// 是否成功 /// public bool success { get; set; } /// /// 状态码 /// public int state { get; set; } /// /// 提示信息 /// public string msg { get; set; } /// /// 成功后需要转向的地址 /// public string goto_url { get; set; } /// /// 构造方法 /// /// /// /// public SSO_State(bool succ, int state, string msg) { this.success = succ; this.state = state; this.msg = msg; } /// /// 返回xml或json格式的值 /// /// xml即返回xml格式值,json即返回json格式值,默认为xml /// public string ToReturn(string type) { return type == "json" ? this.ToJson() : this.ToXml(); } /// /// 转换成xml格式 /// /// public string ToXml() { Type info = this.GetType(); PropertyInfo[] properties = info.GetProperties(); string str = ""; for (int j = 0; j < properties.Length; j++) { PropertyInfo pi = properties[j]; //当前属性的值 object value = info.GetProperty(pi.Name).GetValue(this, null); //属性名(包括泛型名称) var nullableType = Nullable.GetUnderlyingType(pi.PropertyType); string typename = nullableType != null ? nullableType.Name : pi.PropertyType.Name; str += string.Format("<{0}>{1}", pi.Name, _to_property(typename, value)); } str += ""; return str; } /// /// 转换成json格式 /// /// public string ToJson() { Type info = this.GetType(); PropertyInfo[] properties = info.GetProperties(); string str = "{"; for (int j = 0; j < properties.Length; j++) { PropertyInfo pi = properties[j]; //当前属性的值 object value = info.GetProperty(pi.Name).GetValue(this, null); //属性名(包括泛型名称) var nullableType = Nullable.GetUnderlyingType(pi.PropertyType); string typename = nullableType != null ? nullableType.Name : pi.PropertyType.Name; str += string.Format("\"{0}\":\"{1}\",", pi.Name, _to_property(typename, value)); } if (str.Length > 0 && str.Substring(str.Length - 1, 1) == ",") str = str.Substring(0, str.Length - 1); str += "}"; return str; } /// /// 为json输出字段 /// /// 字段的类型名称 /// 字段的值 /// private string _to_property(string typename, object value) { string str = ""; //根据不同类型输出 switch (typename) { case "DateTime": System.DateTime time = System.DateTime.Now; if (value != null) time = Convert.ToDateTime(value); System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1)); // 当地时区 long timeStamp = (long)(time - startTime).TotalMilliseconds; // 相差毫秒数 //将C#时间转换成JS时间字符串 string JSstring = string.Format("eval('new ' + eval('/Date({0})/').source)", timeStamp); str = JSstring; break; case "String": str = value == null ? "" : value.ToString().Replace("\"", "'"); break; case "Boolean": str = value.ToString().ToLower(); break; default: str = value == null ? "" : value.ToString(); break; } return str; } } }