c# - HttpContext session 仅在客户端请求后重置

标签 c# asp.net angularjs session angular

概览

我有一个只有一个 Controller 的 ASP.net 核心 API。有两种相关的方法。第一个是 LoginGet,它通过 URL 接收一个长 token 。通过单独的核心身份验证 API 解析 token 后,长 token 将像这样存储:

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

然后,API 为用户生成一个 GUID 以存储在 session 存储中。用户检索到该 GUID 后,他们可以通过 GetAll 传递它,它通过数据库进行过滤,只挑选出与通过 GUID 传递的用户相关的数据。这意味着 API 必须采用 GUID,并将其与在 LoginGet 请求时存储在 session 中的长 token 进行比较。

好的

当我从本地主机发出这些请求时,一切正常。这是我提出的一系列要求:

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

返回的 GUID 是这样的: 58fa0fec7726433da47dce966b313c69

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

返回我的 json 数据

坏事

上面的例子有效!那怎么了?当我从在不同端口 ( http://localhost:3000/ ) 本地服务的 Angular 2 应用程序中执行完全相同的请求(但具有不同的随机 GUID)时,LoginGet() 成功并返回一个新的 GUID,但是当我第二个请求 GetAll(),紧接在第一个请求之后,在调试时,我看到 API 上的 Session 发生了变化,就好像我正在从新浏览器执行第二个请求,或者我只是清除了我的 cookie。

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

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

以下是与此问题相关的两种请求方法(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、用户给一个longToken 2.长 token 传递给GetLogin(longToken) 3、返回结果,立即订阅。 4. 成功时,从 API 生成的 GUID 设置在 sessionStorage 中 5. 应用路由到不同的组件 (this.router.navigateByUrl('/library?pvy=me')) 6. 路由后,在库组件 ngOnInit 中调用 Get() 并使用存储在 sessionStorage 中的 GUID。 7.结果立即订阅到库组件中。

就是这样

在我的 Angular 2 应用程序中会发生什么改变了 API 上的 session ?还是完全迷失了 session 在 .net 核心中的工作方式?

最佳答案

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

我在 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);
}

关于c# - HttpContext session 仅在客户端请求后重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40636750/

相关文章:

asp.net - 使文本 SEO 友好

javascript - 如何在具有不同功能的asp.net c#形式中使用许多按钮

angularjs - 如何使用一个文件中定义的所有 View 创建 AngularJS 应用程序?

rest - Angularjs ngResource 需要将文件作为字段之一

c# - 旋转时关闭键盘

c# - 在 Visual Studio 2019 中键入时,如何获取第 3 方类的 IntelliSense 提示?

javascript - IIS7 中的 HttpCompression

javascript - 使用 Angular Material 和 JavaScript 开发数据输入应用程序

c# - 使用 Visual Studio 以不同语言运行 C# 应用程序

c# - 您如何在所有版本的 Windows 上可靠地读取用户的显示(名字和姓氏)名称?