根据客户需求我们已经做了一个对应的系统;这个时候客户另一个供应商也开发了一个系统,但是他们要嵌入我们的页面,这里就有个保存用户信息的问题
因为系统是asp.net mvc框架(.net framework 4.5),我们自己系统里面保存用户信息的方式也是使用seesion;要嵌入的页面控制器权限是默认开放了,嵌入授权方式是在他们系统里面打开我们的页面地址会传一个token值,我通过token和key获取用户信息;那我的想法是两个登录方式都要使用session保存用户信息,那我提前再功能代码获取用户信息的时候使用自己的做的视图过滤器先判断一下是不是能拿到用户信息,视图执行完能拿到seesion信息就正常访问页面,拿不到就跳到错误页面
保存seesion信息
public void EmbeddedAuth(string userToken)
{
try
{
if (SessionHelper.Get("UserName") == null)
{
Log.CreateLogManager().Debug("从报表链接地址获取到得userToken:" + userToken);
string accessKey = DataWithReportUtilities.Common.ConfigHelper.GetConfigStr("accessKey");
string url = DataWithReportUtilities.Common.ConfigHelper.GetConfigStr("url");
if (accessKey.IsStrNULL() && url.IsStrNULL())
{
AuthorizationConfiguration authorization = new AuthorizationConfiguration() { userToken = userToken, accessKey = accessKey };
string authorizationJson = Newtonsoft.Json.JsonConvert.SerializeObject(authorization);
string result = HttpUtils.DoPost(url, authorizationJson, "application/json");
OAResultJosn json = JsonConvert.DeserializeObject<OAResultJosn>(result);
if (json.code == 200)
{
OASYSTEM_USER_SESSION oASYSTEM_USER_ = new OASYSTEM_USER_SESSION();
oASYSTEM_USER_.adAccount = "PowerBI_FISK_1";//json.data.adAccount
oASYSTEM_USER_.createTime = DateTime.Now;//DateTime.Parse(json.data.createTime)
SessionHelper.Add("UserName", oASYSTEM_USER_.adAccount.Replace(ConfigHelper.GetConfigStr("LDADUser"), ""), 500);
SessionHelper.Add("UserPwd", Encryptor.AESEncrypt(oASYSTEM_USER_.adAccount), 500);
SessionHelper.Add("UserID", oASYSTEM_USER_.adAccount, 500);
}
else Log.CreateLogManager().Debug("嵌入式访问报表没有获取到当前用户数据!返回状态:" + json.code);
}
}
}
catch (Exception ex)
{
Log.CreateLogManager().Debug("获取嵌入式访问报表用户异常:" + ex);
}
}
public void SignIn(string userAccount, string userPwd)
{
//创建一个FormsAuthenticationTicket,它包含登录名以及额外的用户数据。
var ticket = new FormsAuthenticationTicket(2, userAccount, DateTime.Now, DateTime.Now.AddDays(1), true, "/");
//加密Ticket,变成一个加密的字符串。
var cookieValue = FormsAuthentication.Encrypt(ticket);
//根据加密结果创建登录Cookie
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, cookieValue)
{
HttpOnly = true, //可以防止浏览器攻击窃取、伪造Cookie,但是客户端js无法读取到这个Cookie
Secure = FormsAuthentication.RequireSSL,
Domain = FormsAuthentication.CookieDomain,
Path = FormsAuthentication.FormsCookiePath
};
string adnewname = ConfigHelper.GetConfigStr("LDADUser") + userAccount;
var model = BE.System_UserInfo.Where(u => u.UserAccount == userAccount || u.AADUserAccount == userAccount || u.UserAccount == adnewname && u.Validity == "1").FirstOrDefault();
if (model != null)
{
cookie.Expires = DateTime.Now.AddMinutes(500);//设置保存时间
//cookie.Expires = DateTime.Now.AddMinutes(1);//设置保存时间
SessionHelper.Add("UserName", model.UserAccount.Replace(ConfigHelper.GetConfigStr("LDADUser"), ""), 500);
SessionHelper.Add("UserPwd", Encryptor.AESEncrypt(userPwd), 500);
SessionHelper.Add("UserID", model.ID, 500);
var context = HttpContext.Current;
//写登录Cookie
context.Response.Cookies.Remove(cookie.Name);
context.Response.Cookies.Add(cookie);
}
}
没有拿到seesion跳错误页面
///
/// 加载“视图”后执行
///
/// <param name="filterContext"></param>
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
Log.CreateLogManager().Debug("用户名:" + User.UserInfo());
if (!User.UserInfo().IsStrNULL())
{
string ResponseAddress = ConfigHelper.GetConfigStr("ResponseAddress");
string url = ResponseAddress + "/zh-CN/Home/Error";
string str = "<script>window.location.href='" + url + "'</script>";
//Log.CreateLogManager().Debug("地址:"+url);
//filterContext.HttpContext.Response.Write(str);
}
}
现在的情况就是
1.当没有一个用户登录的时候,我打开需要嵌入的页面不传Token会自动跳到错误页面
2.走系统登录或者嵌入式登录获取的信息都是不一样的
3.当有一个人(用户A)再A电脑走系统登录方式的时候访问开放页面,另一个人(用户B)使用B电脑访问开放的页面(嵌入页面,不通过问号传参的方式携带Token)居然也能正常访问页面,不跳转到错误页面,而且访问信息是用户A的
现在遇到的困惑时第3种情况不知道怎么解决,因为系统登录方式浏览器里面有seesion_cookie;直接打开的开放页面没有seesion_cookie,居然还是用别人的信息就不能理解