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)
[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身份验证系统,则还需要注意两件事:
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);