【问题标题】:HttpContext Session resets after client side request onlyHttpContext 会话仅在客户端请求后重置
【发布时间】: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 数据

坏人

上面的例子有效!那么有什么问题呢?当我从在不同端口(@98​​7654323@)上本地服务的 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


    【解决方案1】:

    我发现,当从浏览器地址栏中从外部访问 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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多