/// <summary> /// 登录页面提交登录请求。 /// </summary> /// <param name="context"></param> public void HandleLogin(HttpContext context) { var account = SampleDB.FindAccount(context.Request["account"], Util.ComputePasswordHash(context.Request["pwd"], context.Request["account"])); if (account != null) { //8 登录成功,创建用户账号对应的token xxx var token = Util.GetTokenForAccount(account); //9 把token写到本站cookie; context.Response.SetCookie(new HttpCookie("baibaomensso", token)); //这个cookie和sso流程无关,是方便SSO的login.html前端页面显示用户名用的。 context.Response.SetCookie(new HttpCookie("username", account.Name)); //9 跳转到returnurl并带上token。此处只输出token,在前端页面回调中执行跳转。 context.Response.Write(token); context.Response.End(); //context.Response.Redirect(MakeReturnUrl(context.Request["returnurl"],token),true); } else { //不应该用401,不合理而且会导致浏览器弹出登录框:http://stackoverflow.com/questions/1959947/whats-an-appropriate-http-status-code-to-return-by-a-rest-api-service-for-a-val //context.Response.StatusCode = 401; context.Response.StatusCode = 422; } }
private void HandleValidate(HttpContext context) { var theToken = Util.DecryptTokenForValidationRequest(context.Request); UserInfo theAccount = null; if (!string.IsNullOrEmpty(theToken)) { theAccount = Util.FindAccountForToken(theToken); } else { //todo:要检查账号所在域名是否正确。 string accountStr = null; if (context.User != null && context.User.Identity != null) { accountStr = context.User.Identity.Name.Split('\\')[1].ToLower(); } if (!string.IsNullOrEmpty(accountStr)) { theAccount = SampleDB.FindAccount(accountStr); } } if (theAccount != null) { //13. 验证通过。 //14. 告知token有效,并附带允许站点获取的用户信息。 //32. 同13。 //33. 同14。 //todo:实际场景中,应该根据请求的server-key,只传递该server能看到的用户信息。 context.Response.Write(Newtonsoft.Json.JsonConvert.SerializeObject(theAccount)); } context.Response.End(); }