Angularjs 通过AJAX登录,在MVC+中使用cookie;有棱角的科尔斯

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

我必须将aspnetboilerplate(Asp.NETMVC+AngularJS前端)Web与API部分分离,并同时对AngularJS+Asp.NETMVC中的用户进行身份验证。这适用于单个域。当API托管在另一台服务器上时不工作

我的MVC AccountController操作登录:

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
        }