我有一个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,如上所述。
我觉得这必须是我在前端如何提出请求的问题。但我不明白这是怎么回事。即使有路由,我的会话应该保持不变。
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核心中工作?
答案 0 :(得分:2)
我发现,当从外部访问API时,从浏览器地址栏中,会自动生成标题。这意味着会话中的cookie可以存储在那里。当我从angular 2 App调用我的Get()方法时,我没有在我的请求中添加标题,因此API假设它是一个新会话。
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);
}