【问题标题】:Understanding storage of OAuth token了解 OAuth 令牌的存储
【发布时间】:2016-12-02 19:54:43
【问题描述】:

我已经按照本教程实现了ASP.NET Identity认证和OAuth授权:http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

它目前正在工作,但我不完全了解 TOKEN 及其计时器的存储位置。

这是生成令牌的代码:

public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvider
    {
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            context.Validated();
        }

        public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
        {

            context.OwinContext.Response.Headers.Add("Access-Control-Allow-Origin", new[] { "*" });

            using (AuthRepository _repo = new AuthRepository())
            {
                IdentityUser user = await _repo.FindUser(context.UserName, context.Password);

                if (user == null)
                {
                    context.SetError("invalid_grant", "The user name or password is incorrect.");
                    return;
                }
            }

            var identity = new ClaimsIdentity(context.Options.AuthenticationType);
            identity.AddClaim(new Claim("sub", context.UserName));
            identity.AddClaim(new Claim("role", "user"));

            context.Validated(identity);

        }
    }

我猜这个令牌存储在 ASP.NET 身份数据库或托管的 WEB API 应用程序中,但我不完全理解。

【问题讨论】:

  • 令牌在应用程序的内存中。默认情况下它不会存储在任何地方。您应该查看 IdentityServer 实现以获得更强大的 oauth 令牌提供程序。

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


【解决方案1】:

令牌仅由提供者生成一次,并且不会存储在任何地方。它包含应用程序验证请求所需的信息,仅此而已。

假设你使用 Json Web Tokens 或 JWT,那么 token 只不过是一个 Json 对象,具有一些属性,例如过期时间、实际持续时间(以秒为单位)等。

令牌的持续时间是可配置的,因此假设您希望将该令牌重复用于多次调用,那么客户端应用程序将需要以安全的方式存储在某处。例如,它可能在会话中,您可以存储整个令牌,当您需要它时,只需通过查看持续时间来检查它是否仍然处于活动状态。如果它不再处于活动状态,您要么刷新当前拥有的,要么简单地请求另一个。

你可以用这样的东西很好地封装这一切:

private TokenModel GetToken()
        {
            TokenModel result = null;

            if (this._systemState.HasValidToken(this._currentDateTime) )
            {
                result = this._systemState.RetrieveUserData().TokenData;
            }
            else
            {
                try
                {
                    result = this._portalApiWrapperBase.RequestAccessTokenData();
                }
                catch(Exception ex)
                {
                    this.LastErrorMessage = ex.Message;
                }
                finally
                {
                    this._systemState.AddTokenData(result);
                }
            }

            return result;
        }

在我的例子中,所有这些用户数据都存储在 Session 中,并从那里简单地检索。

我没有在这里显示所有代码,但我基本上有一个状态提供程序,一旦我第一次收到它,我就会在其中存储令牌。下次我需要它时,如果它仍然有效,我会退回它,或者如果它不是,就去请求另一个。所有这些对应用程序都是隐藏的,您只需调用 GetToken 方法,它就会处理其他所有事情。

现在,令牌应该是应用程序级别的,它是根据 ClientID 和 CLientSecret 生成的,因此您可以在需要时轻松请求另一个令牌。

【讨论】:

    【解决方案2】:

    令牌未存储。请求令牌的用户需要能够在每个请求上传递令牌才能进行经过身份验证的调用。因此,客户端有责任存储令牌以执行此操作。 (对于短期会话,可能在内存中,对于长期会话,可能在磁盘/数据库中。

    服务器不需要存储令牌,因为它是由客户端在每次请求时传递的。人们可能会将其存储在服务器上的数据库中并检查令牌是否存在。使用这种机制,您可以通过从数据库中删除令牌来撤销令牌。不过,还有其他方法可以做到这一点。

    我猜你的计时器是指令牌的生命周期。框架会在每个请求上进行检查。所以没有实际的计时器。

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 2017-01-10
      • 2011-09-12
      • 2021-09-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多