【发布时间】:2016-11-17 05:33:53
【问题描述】:
概述
我有一个具有一个控制器的 ASP.net 核心 API。有两种相关的方法。第一个是 LoginGet,它通过 URL 接收一个长令牌。通过单独的核心身份验证 API 解析令牌后,长令牌的存储方式如下:
Request.HttpContext.Session.Set(longToken, Encoding.UTF8.GetBytes(stringResult));
然后,API 生成一个 GUID 供用户存储在会话存储中。用户检索到该 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 数据
坏人
上面的例子有效!那么有什么问题呢?当我从在不同端口(@987654323@)上本地服务的 Angular 2 应用程序执行完全相同的请求(但使用不同的随机 GUID)时,LoginGet() 成功并返回一个新的 GUID,但是当我第二个请求 GetAll() 紧随第一个请求之后,在调试时,我看到 API 上的 Session 发生了变化,就好像我正在从新浏览器执行第二个请求,或者我只是清除了我的 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('/library?pvy=me')) 6. 路由后,在库组件ngOnInit中,调用Get(),使用sessionStorage中存储的GUID。 7. 结果立即在库组件中订阅。
就是这样
在我的 Angular 2 应用程序中会发生什么改变 API 上的会话?还是完全不了解 Sessions 在 .net 核心中的工作方式?
【问题讨论】:
标签: c# asp.net angularjs session angular