了解OAuth令牌的存储

时间:2016-12-02 07:46:12

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

我已根据本教程实施了ASP.NET身份验证和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 Identity DB或托管的WEB API应用程序中,但我不完全理解。

2 个答案:

答案 0 :(得分:1)

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

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

通过计时器,我猜你的意思是令牌的生命周期。每个请求都由框架检查。所以没有实际的计时器。

答案 1 :(得分:1)

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

假设您使用Json Web Tokens或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生成的,因此您可以在需要时轻松请求另一个。