【问题标题】:Store owin oauth bearer token存储 owin oauth 不记名令牌
【发布时间】:2023-03-05 13:35:01
【问题描述】:

我正在使用默认的 owin oauth 服务器创建一个简单的身份验证服务器。提供正确的凭据后,将生成承载令牌并将其返回给客户端。我使用了 Taiseer 的 tutorial

我想在将令牌发送到客户端之前将令牌存储在数据库中。 也许我完全忽略了它,但是在发送令牌之前我在哪里可以获得令牌?据我所知,令牌是在 GrantResourceOwnerCredentials 方法中验证票证后生成的。 我猜令牌存储在上下文中。怎么弄出来?

Startup.cs

private void ConfigureAuthServer(IAppBuilder app) {
  // Configure the application for OAuth based flow
  var oAuthServerOptions = new OAuthAuthorizationServerOptions {
    //For Dev enviroment only (on production should be AllowInsecureHttp = false)
    AllowInsecureHttp = true,
    TokenEndpointPath = new PathString("/oauth/token"),
    Provider = new ApplicationOAuthProvider(),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14)
  };

  // Enable the application to use bearer tokens to authenticate users
  app.UseOAuthAuthorizationServer(oAuthServerOptions);
  app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());
}

ApplicationOAuthProvider

public override Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) {
  //Dummy check here
  if (context.UserName != context.Password) {
    context.SetError("invalid_grant", "The user name or password is incorrect");
    return Task.FromResult<object>(null);
  }

  var claims = new List<Claim> {
    new Claim(ClaimTypes.NameIdentifier, context.UserName),
    new Claim(ClaimTypes.Name, context.UserName)
  };

  var oAuthIdentity = new ClaimsIdentity(claims, OAuthDefaults.AuthenticationType);

  AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, new AuthenticationProperties());
  context.Validated(ticket);
  return Task.FromResult<object>(null);
}

public override Task TokenEndpoint(OAuthTokenEndpointContext context) {
  foreach (KeyValuePair<string, string> property in context.Properties.Dictionary) {
    context.AdditionalResponseParameters.Add(property.Key, property.Value);
  }

  return Task.FromResult<object>(null);
}

注意:对于那些想知道我为什么要存储令牌的人..这是我必须满足的要求。

【问题讨论】:

  • 对此有何反馈?

标签: asp.net-web-api oauth owin


【解决方案1】:

要在将令牌发送到客户端之前获取令牌,您必须覆盖 TokenEndpointResponse

public override Task TokenEndpointResponse(OAuthTokenEndpointResponseContext context)
{
    return base.TokenEndpointResponse(context);
}

context 对象有一个属性AccessToken,它将包含表示为字符串的令牌。

OAuthTokenEndpointResponseContext 包含一个对象字典
AdditionalResponseParameters 中的IDictionary&lt;string, object&gt;,这使我们能够找到该身份的所有声明。

如果我们想获取令牌的过期时间,我们会在字典中找到声明 .expires

context.AdditionalResponseParameters[".expires"]

如果有人有兴趣尝试简单的客户端和服务器交互集成,请访问 github repository

【讨论】:

  • 很高兴我能帮上忙,David K. Cheers。
  • 如何为每个 api 请求验证来自数据库的访问令牌?
  • @SaadKhan:GrantResourceOwnerCredentials 是验证资源请求的入口点。 OAuthGrantResourceOwnerCredentialsContext 将为您提供 2 个属性:UserNamePassword
  • @LeftyX 这是真的。我已经在验证数据库中的那些,如果验证,则生成访问令牌。我想将访问令牌存储在数据库中,我正在使用 TokenEndpointResponse。现在我想为每个 API 请求验证这个访问令牌。假设我有一个端点名称 abc.com/api/search 并且用户正在请求标头中传递访问令牌。在处理此请求之前,我想从我的数据库中匹配该访问令牌。我该怎么做?
  • @Learning: Owin 对数据库没有任何依赖关系,也没有 api 或 oauth 集成。您可以在 Web 上找到的大多数解决方案都使用 asp.net identityEntity Frameworksql server 来表示 UserStore。可以对其进行定制以使用其他存储系统。这个answer 将帮助您深入研究此事。在底部,您会找到一个使用自定义数据库的 github 存储库的链接。干杯。
猜你喜欢
  • 2022-06-11
  • 2019-11-30
  • 2014-04-07
  • 2021-01-14
  • 1970-01-01
  • 2014-01-04
  • 2011-09-12
  • 2015-08-01
  • 1970-01-01
相关资源
最近更新 更多