Angularjs 通过AJAX登录,在MVC+中使用cookie;有棱角的科尔斯
我必须将aspnetboilerplate(Asp.NETMVC+AngularJS前端)Web与API部分分离,并同时对AngularJS+Asp.NETMVC中的用户进行身份验证。这适用于单个域。当API托管在另一台服务器上时不工作 我的MVC AccountController操作登录:Angularjs 通过AJAX登录,在MVC+中使用cookie;有棱角的科尔斯,angularjs,ajax,asp.net-mvc,cors,aspnetboilerplate,Angularjs,Ajax,Asp.net Mvc,Cors,Aspnetboilerplate,我必须将aspnetboilerplate(Asp.NETMVC+AngularJS前端)Web与API部分分离,并同时对AngularJS+Asp.NETMVC中的用户进行身份验证。这适用于单个域。当API托管在另一台服务器上时不工作 我的MVC AccountController操作登录: AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = rememberMe }, identity); re
AuthenticationManager.SignIn(new AuthenticationProperties { IsPersistent = rememberMe }, identity);
return Json(new AjaxResponse {Success = true, TargetUrl = Request.ApplicationPath });
我的Login.js文件:
$("#LoginButton").click(function(e) {
e.preventDefault();
abp.ui.setBusy(
$("#LoginArea"),
abp.ajax({
url: "http://internallyAccesibleServer/Account/Login",
//url: abp.appPath + "Account/Login",
type: "POST",
crossDomain: true,
data: JSON.stringify({
tenancyName: $("#TenancyName").val(),
usernameOrEmailAddress: $("#EmailAddressInput").val(),
password: $("#PasswordInput").val(),
rememberMe: false
})
})
.done(function(response) {
abp.message.info("Login succeeded");})
.fail(function(data) {
abp.message.error(data.details, data.message);
})
);
});
当我在电脑上运行时hxxp://internallyAccesibleServer/ -登录成功,我可以通过AngularJS访问授权resurces。
如果我从任何其他服务器运行相同的Login.js代码,我会看到一条“Login successed”(登录成功)消息(在我的InternallyAccessible服务器上也会看到一条数据库/日志记录,所以AJAX请求工作正常),然后是HTTP响应302,它由MVC框架从401转换而来,位置头中的URL是"hxxp://otherserver/account/login“-因此,请求的来源
My Web.config关于CORS的信息:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="GET, POST, HEAD, OPTIONS" />
<add name="Access-Control-Allow-Headers" value="Content-Type, x-xsrf-token" />
</customHeaders>
</httpProtocol>
我将非常感谢您的回答。请按照以下步骤操作:
在ASP.NET Web API 2中启用跨源请求
在全球范围内启用CORS
上述方法也可用于跨API启用,而无需注释每个控制器:
public static void Register(HttpConfiguration config)
{
var corsAttr = new EnableCorsAttribute("http://example.com", "*", "*");
config.EnableCors(corsAttr);
}
我认为这里的问题是cookies没有发送到浏览器。 要解决这个问题,您首先需要添加以下标题,告诉浏览器将响应公开给前端JS代码
,如果在响应上设置了targetUrl属性,则会重定向到该属性。基于Cookie的身份验证无法跨源工作,因为Cookie始终是域绑定的,无论您的CORS设置如何。我有点这样想:-(谢谢您的回答)。
public static void Register(HttpConfiguration config)
{
var corsAttr = new EnableCorsAttribute("http://example.com", "*", "*");
config.EnableCors(corsAttr);
}
$.ajax({
url: "http://internallyAccesibleServer/Account/Login",
type: "POST",
contentType: "application/json",
data: JSON.stringify({
tenancyName: $("#TenancyName").val(),
usernameOrEmailAddress: $("#EmailAddressInput").val(),
password: $("#PasswordInput").val(),
rememberMe: false
}),
xhrFields: {
withCredentials: true
}