繁体   English   中英

了解OAuth令牌的存储

[英]Understanding storage of OAuth token

我已根据本教程实现了ASP.NET Identity身份验证和OAuth授权: http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/ : http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

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

这是生成令牌的代码:

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 Identity DB或托管的WEB API应用程序中,但是我不完全了解。

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

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

我猜计时器是指令牌的生存期。 框架会根据每个请求进行检查。 因此,没有实际的计时器。

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

假设您使用Json Web令牌或JWT,则令牌不过是具有某些属性的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生成的,因此您可以在需要时轻松请求另一个令牌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM