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

时间:2016-11-16 16:04:27

标签: c# asp.net angularjs session angular

概述

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

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

然后,API为用户生成GUID以存储在会话存储中。在用户检索到该GUID之后,他们可以通过GetAll传递它,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.用户提供longToken 2.长令牌传递给GetLogin(longToken) 3.结果返回并立即订阅。 4.成功时,API中生成的GUID在sessionStorage中设置 5.应用程序路由到另一个组件( this.router.navigateByUrl(&#39; / library?pvy = me&#39;)) 6.路由之后,在库组件ngOnInit中,调用Get()并使用存储在sessionStorage中的GUID。 7.结果立即在库组件中订阅。

那是

我的Angular 2应用程序中发生了哪些更改API会话?或者我完全迷失了Sessions如何在.net核心中工作?

1 个答案:

答案 0 :(得分:2)

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

我在角度2 app上的新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);
}