Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在未在浏览器中创建的响应标头中设置Cookie-使用http POST_Asp.net Mvc_Angular_Cookies_Asp.net Web Api_Cors - Fatal编程技术网

Asp.net mvc 在未在浏览器中创建的响应标头中设置Cookie-使用http POST

Asp.net mvc 在未在浏览器中创建的响应标头中设置Cookie-使用http POST,asp.net-mvc,angular,cookies,asp.net-web-api,cors,Asp.net Mvc,Angular,Cookies,Asp.net Web Api,Cors,我一直被困在与饼干有关的问题上 我的设想是: 我的后端在服务器上(localhst:12456) 我的Angular 2应用程序在另一台服务器上运行(localhost:5555) 我的后端只是一个ASP.NET应用程序,我正在尝试从apiController对用户进行身份验证。api控制器如下所示: [System.Web.Mvc.HttpPost] public HttpResponseMessage HandleLogin([FromBody] LoginModel l

我一直被困在与饼干有关的问题上

我的设想是:

  • 我的后端在服务器上(localhst:12456)
  • 我的Angular 2应用程序在另一台服务器上运行(localhost:5555)
我的后端只是一个ASP.NET应用程序,我正在尝试从apiController对用户进行身份验证。api控制器如下所示:

[System.Web.Mvc.HttpPost]
        public HttpResponseMessage HandleLogin([FromBody] LoginModel loginModel)
        {
            if (!String.IsNullOrEmpty(loginModel.Username) && !String.IsNullOrEmpty(loginModel.Password))
            {

                if (Members.Login(loginModel.Username, loginModel.Password))
                {
                    var resp = Request.CreateResponse<UserAuthenticationModel>(
                         HttpStatusCode.OK,
                        new UserAuthenticationModel() { IsAuthenticated = true}
                    );

                    //create and set cookie in response
                    var cookie = new CookieHeaderValue("customCookie", "cookieVal");
                    cookie.Expires = DateTimeOffset.Now.AddDays(1);
                    cookie.Domain = Request.RequestUri.Host;
                    cookie.Path = "/";
                    resp.Headers.AddCookies(new CookieHeaderValue[] { cookie });

                    return resp;
                }
            }

            return Request.CreateResponse<UserAuthenticationModel>(
                  new UserAuthenticationModel() { IsAuthenticated = false }
            );
        }
这是.\u loginService.getLoginModel() .订阅( loginModel=>this.\u signInPageModel=loginModel, error=>console.log(错误) ); 现在,在我的api控制器方法(HandleLogin)中,我有一个测试cookie和另一个用于FormsAuthentication的cookie,当用户成功登录并返回到我的angular应用程序时,不会创建cookie

现在,可以看到cookies以及我的回复标题:

我很困惑,并感谢任何帮助,以获得成功的登录过程


提前谢谢你。

我在同一个问题上浪费了整整一天。我发现这些是重要的一点:

1。您需要在服务器上添加以下标题(替换为您的客户端主机地址)。这是需要的,因为您的两个站点使用不同的端口号

Access-Control-Allow-Origin: http://localhost:5555
Access-Control-Allow-Credentials: true
对于WebAPI,这意味着将以下内容放置在
WebApiConfig.Register
的顶部:

var cors = new EnableCorsAttribute("http://localhost:5555", "*", "GET,POST");
cors.SupportsCredentials = true;
config.EnableCors(cors);
2。精确设置cookies的方式

看看这些:

response.Headers.AddCookies(new CookieHeaderValue[] 
{ 
  new CookieHeaderValue("WorkingCookie", cookieValue) { Path="/" }, 
  new CookieHeaderValue("NotWorkingCookie", cookieValue) 
});
如果不指定路径,我无法使CORS cookie正常工作。另外,声明在生产环境中,还需要指定域。我还没到那里,所以我只是暂时记着

3。注意后端限制

据我所知,Web API并不是一个真正的问题,但对于PHP来说,多个
Set Cookie
头并不能很好地工作。我只能在客户端上持久化列出的最后一个

4。在HTTP请求中使用withCredentials*

这是我对前面列出的电话的看法:

return this._http.post(this._globalVariables.BACKEND_API_HANDLE_LOGIN,
    loginModel, {headers: headers, withCredentials: true})
    .map((response : Response) => response);
注意,凭证作为选项的一部分正在传递

这是你缺少的部分,绝对是关键。其他步骤用于确保服务器正确发送cookie并由浏览器持久化,但由凭据控制

不过,您需要确保使用的是Angular的更新版本;甚至有些RC版本完全忽略了
with credentials
选项,因此根本无法用于此类CORS调用

最后一个音符 如果您正在使用cookie创建CORS身份验证系统,则还需要注意两件事:

  • 在Web API中标记会话cookie
    HttpOnly
    ,这样它就不会被注入的JavaScript篡改
  • 生成并存储服务器端密钥,并将其返回到名为
    XSRF-TOKEN
    的(非
    HttpOnly
    )cookie中。在每个API调用中,将此存储值与Angular将返回的
    X-XSRF-TOKEN
    头的值进行比较。这是预防疾病所必需的

  • 你的问题是什么?你找到问题了吗?
    return this._http.post(this._globalVariables.BACKEND_API_HANDLE_LOGIN,
        loginModel, {headers: headers, withCredentials: true})
        .map((response : Response) => response);