【问题标题】:Regarding oAuth Token used in web api关于 web api 中使用的 oAuth Token
【发布时间】:2017-07-18 22:36:40
【问题描述】:

我正在使用 OAuth/Owin 生成令牌,并且该令牌在请求的授权标头中发送回;它会自动进行比较,这就是我验证请求是否来自有效用户的方式。令牌属于不记名类型。

生成token的代码如下:

private string GenerateAuthToken(TelephonyLoginCdto loginDto, double tokenExpirationTimeInHours)
        {
            //Generate AuthToken
            var identity = new ClaimsIdentity(OAuthDefaults.AuthenticationType);
            identity.AddClaim(new Claim(ClaimTypes.Name, loginDto.Username));
            var currentUtc = DateTime.UtcNow;
            var props = new AuthenticationProperties()
            {
                IssuedUtc = currentUtc,
                ExpiresUtc = currentUtc.Add(TimeSpan.FromHours(tokenExpirationTimeInHours))
            };
            var ticket = new AuthenticationTicket(identity, props);
            var accessToken = StartUp.OAuthBearerOptions.AccessTokenFormat.Protect(ticket);
            return accessToken;
        }

外部系统会使用我的 API。 流程将是: 1.外部系统先打登录api。登录 api 返回一个令牌。 2. 外部系统使用该令牌并将其传递到另一个请求授权标头中,以使用 API 的另一种方法进行一些更新。

他们可以在一天内多次重复上述过程,比如5~6次。他们来点击登录;获得令牌。通过调用 API 的 save/get 方法,使用该令牌执行一些操作。

我的问题是,当外部系统长时间没有使用我的任何 API 方法并且处于空闲状态时。现在,如果外部系统必须点击 API 来做某事,他们需要再次点击登录 API 以获取令牌,然后使用其他 API 方法。如果他们更频繁地说在 10~15 分钟内返回令牌只需要 1~2 秒,但如果他们说在 2~2.5 小时后我的登录 API 需要 30 秒来返回令牌。

我没有做任何刷新令牌机制,我想它会花费这么多时间,因为已经生成了这么多令牌,并且 owin 正在尝试清理服务器然后给出令牌。我不知道发生了什么?

【问题讨论】:

  • 如果不知道可能是什么原因,请尝试记录您的身份验证机制。之后在日志中看看是什么花了这么多时间。

标签: c#-4.0 asp.net-web-api oauth owin


【解决方案1】:

您可能想看看AccessTokenExpireTimeSpan

访问令牌发出后保持有效的时间段。 默认为 20 分钟
客户端应用程序应在令牌过期后刷新或获取新的访问令牌。

在你的创业公司中,你应该有这样的东西:

var OAuthOptions = new OAuthAuthorizationServerOptions
{
    // AllowInsecureHttp = true,
    TokenEndpointPath = new PathString("/oauth/Token"),
    AccessTokenExpireTimeSpan = TimeSpan.FromHours(8),
    Provider = new Providers.MyAuthorizationServerProvider(),
    // RefreshTokenProvider = new Providers.MyRefreshTokenProvider(DateTime.UtcNow.AddHours(8))
};
app.UseOAuthAuthorizationServer(OAuthOptions);
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

阅读您的代码,您似乎没有遵循正确的管道。 我建议您阅读this 文章,它将指导您完成整个过程。

关于您最后一个关于 api 超过 2 小时没有被任何请求击中时的延迟的问题,这可能是导致 IIS(如果您在该环境中托管您的 api)被大喊大叫。

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 2016-10-30
    • 2019-05-31
    • 1970-01-01
    • 2016-09-20
    相关资源
    最近更新 更多