问题:ajax跨域请求用户登录信息,返回用户信息,跳转不到目标页。
由于使用MVC框架页面加载时先到controller中找到启动项,return view()后登录页加载,点击“登录”从服务器得到用户信息。若不经过验证直接重定向跳转不到目标页,对应链接:http://localhost:6422/Index/Login2?ReturnUrl=%2fUserMgmt%2fUserAuthorityMgmt%3fisAdmin%3d1&isAdmin=1
经过验证,MVC对用户登录信息需要[AllowAnonymous] 、FormsAuthenticationTicket认证,并记住在Cookie中。对应链接为:http://localhost:6422/UserMgmt/UserAuthorityMgmt?isAdmin=1
正确做法示例:(注意JS异步请求)
(1)先从服务器请求用户信息
function login() {
var id = $("#username").val();
var pass = $("#password").val();
var M = {};
if (id == "" || null) {
MsgHint(M, "账号不能为空!")
return;
}
else if (pass == "" || null) {
MsgHint(M, "请输入密码!")
return;
}
else {
var isAdmin = "0";
var postData = { action: "WebAccountLogin", UserId: id, PassWord: pass };
$.ajax({
type: "POST",
url: "http://xxx.xxx.xxx.xxx:8050//EntranceService.svc/postData?token= ",
data: JSON.stringify(postData),
dataType: "text",
success: function (data) {
var result = JSON.parse(data);
var M1 = {};
if (result.status == 0) {
isAdmin = result.value.Islogin;
userAuthentic(isAdmin,id,pass,name); //注意ajax异步执行,顺序
}
else {
MsgHint(M1, "用户名或密码错误,请重新输入!");
}
},
error: function () { alert("输入异常,请重新输入!") }
});
}
}
(2)请求后台用户信息验证——MVC FormsAuthentication验证并记录Cookie
function userAuthentic(isAdmin, id, pass, name) {
$.ajax({
type: "POST",
url: "/Index/UserAuthentic/",
data: {
ID: id,
Pass: pass,
userName: "Miss Wang"
},
dataType: "text",
success: function (data) {
if (data == "OK") {
window.location.href = "/UserMgmt/UserAuthorityMgmt?isAdmin=" + isAdmin;
}
else {
alert("输入异常,请重新输入!");
$("#username").val("");
$("#password").val("");
}
},
error: function () { alert("输入异常,请重新输入!") }, //错误提示
});
}
(3)后台对用户信息验证
[AllowAnonymous]
public string UserAuthentic()
{
string userID = Request.Form["ID"]; //账号:用户名或电话号码
string pass = MD5.Md5Hash(Request.Form["Pass"].ToString());
string userName = Request.Form["userName"];
try {
if (!string.IsNullOrEmpty(userName))
{
HttpCookie hc = new HttpCookie("User");
hc.Values.Add("UserID", userID);
hc.Values.Add("UserName", Url.Encode(userName));
Response.Cookies.Add(hc); //cookie记录用户信息
Session.Add("userId", userID); //满足日志记录使用
bool cookiePer = true;
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket //数据经过加密,前台无法直接从cookie中获取
(1, // 票证的版本号。
userID, // 与票证关联的用户名。
DateTime.Now, //票证发出时的本地日期和时间。
DateTime.Now.AddDays(1), //票证过期时的本地日期和时间。
cookiePer, //如果票证将存储在持久性 Cookie 中(跨浏览器会话保存),则为 true;否则为 false。
"", //存储在票证中的用户特定的数据。
"/" //票证存储在 Cookie 中时的路径。
);
var cookie = new HttpCookie(FormsAuthentication.FormsCookieName, FormsAuthentication.Encrypt(ticket));
cookie.HttpOnly = true;
HttpContext.Response.Cookies.Add(cookie);
return "OK";
}
else {
return "error";
}
}
catch(Exception ex) {
LogToDB.Fatal(ex);
return "exception";
}
}