HttpContext 会话仅在客户端请求后重置

本文关键字:请求 客户端 会话 HttpContext | 更新日期: 2023-09-27 18:18:08

概述

我有一个 ASP.net 核心 API,它有一个控制器。有两种相关的方法。第一个是LoginGet,它通过URL接收长令牌。通过单独的核心身份验证 API 解析令牌后,长令牌的存储方式如下:

 Request.HttpContext.Session.Set(longToken, Encoding.UTF8.GetBytes(stringResult));

然后,API 生成一个 GUID,供用户存储在会话存储中。用户检索该 GUID 后,他们可以通过 GetAll 传递该 GUID,GetAll 筛选数据库,仅选取与通过 GUID 传递的用户相关的数据。这意味着 API 必须获取 GUID,并将其与在 LoginGet 请求时存储在会话中的长令牌进行比较。

当我从本地主机那里遇到这些请求时,这一切都有效。以下是我提出的一系列要求:

首先我点击 LoginGet((:http://localhost:5000/api/picker/login?token=ljadsljdaslkjsdfljkljgsdfkjgfFSDDFSsakgfjhdfkhdsfFDAS/asdfkjhdsf+sfdhjkfdsa

这将返回如下所示的 GUID:58fa0fec7726433da47dce966b313c69

然后我点击了 GetAll((:http://localhost:5000/api/picker?ath=58fa0fec7726433da47dce966b313c69

返回我的 json 数据

坏人

上面的例子有效!那么怎么了呢?当我从我的 Angular 2 应用程序执行完全相同的请求(但使用不同的随机 GUID(时,该应用程序在不同的端口 (http://localhost:3000/( 上本地提供服务,LoginGet(( 成功并返回一个新的 GUID,但是当我在调试时立即发出第二个请求 GetAll(( 时,我看到 API 上的会话已更改, 就好像我正在从新浏览器执行第二个请求,或者我刚刚清除了我的 cookie。

当我只是自己手动从浏览器进行这些调用时,情况并非如此。我的请求被控制台记录在前端,并且我得到与上面解释的完全相同的请求 URL。

我觉得这必须是我在前端发出请求的方式的问题。但我不明白怎么会这样。即使使用路由,我的会话也应保持不变。

以下是与此问题相关的两种请求方法(Angular 2(

public Get(): Observable<{}> {
    let newQuery = 'http://localhost:5000/api/picker?ath=' + sessionStorage.getItem('user.token');
    return this.http.get(newQuery).map(this.extractData)
        .catch(this.handleError);
}
public GetLogin(longToken: string) {
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });
    let body = JSON.stringify({ password: longToken });
    return this.http.get('http://localhost:5000/api/picker/login?token=' + longToken);
}

这些请求的操作顺序如下:1. 长令牌由用户提供2. 长令牌传递给 GetLogin(longToken(3. 返回结果并立即订阅。4. 成功后,在会话存储中设置从 API 生成的 GUID5. 应用程序路由到不同的组件(this.router.navigateByUrl('/library?pvy=me'((6. 路由后,在库组件 ngOnInit 中,调用 Get(( 并使用存储在 sessionStorage 中的 GUID。7. 结果会立即在库组件中订阅。

就是这样

我的 Angular 2 应用程序中可能发生了什么,从而改变了 API 上的会话?或者我只是完全迷失了会话在 .net 核心中的工作方式?

HttpContext 会话仅在客户端请求后重置

我发现,当从浏览器地址栏外部访问 API 时,会自动生成标头。这意味着会话中的 cookie 可以存储在那里。当我从 angular 2 App 调用我的 Get(( 方法时,我没有向我的请求添加标头,因此 API 假定它是一个新会话。

我在 angular 2 应用程序上的新 Get(( 方法:

public Get(): Observable<{}> {
    let newQuery = 'http://localhost:5000/api/picker?ath=' + sessionStorage.getItem('user.token');
    let headers = new Headers({ 'Content-Type': 'application/json' });
    let options = new RequestOptions({ headers: headers });
    return this.http.get(newQuery, options).map(this.extractData)
        .catch(this.handleError);
}