C# 理解OAuth令牌的存储

C# 理解OAuth令牌的存储,c#,asp.net-web-api,oauth,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/ 它目前正在工作,但我不完全了解令牌和它的计时器存储在哪里 这是生成令牌的代码: public class SimpleAuthorizationServerProvider : OAuthAuthorizationServerProvid

我已经根据本教程实现了ASP.NET身份验证和OAuth授权:
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应用程序中,但我不完全理解。

令牌没有存储。请求令牌的用户需要能够在每次请求时传递令牌,以便进行经过身份验证的调用。因此,客户机有责任存储令牌以实现这一点。(对于短期会话,可能在内存中;对于长期会话,可能在磁盘/数据库中

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


计时器我猜你指的是令牌的生存期。框架在每次请求时都会对其进行检查。因此没有实际的计时器。

令牌没有存储。请求令牌的用户需要能够在每次请求时传递令牌,以便进行经验证的呼叫。因此,客户端有责任存储令牌In)这样做。(对于短期会话,可能在内存中;对于长期会话,可能在磁盘/数据库中。)

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


计时器我猜你指的是令牌的生存期。框架会在每个请求上检查它。因此没有实际的计时器。

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

假设您使用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;
        }
在我的例子中,所有这些用户数据都存储在会话中,并从会话中检索

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


现在,令牌应该是应用程序级的,它是基于ClientID和CLientSecret生成的,因此您可以在需要时方便地请求另一个令牌。

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

假设您使用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;
        }
在我的例子中,所有这些用户数据都存储在会话中,并从会话中检索

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


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

令牌位于应用程序的内存中。默认情况下,它不会存储在任何位置。您应该查看IdentityServer实现,以获得更健壮的oauth令牌提供程序。令牌是在应用程序的内存中。默认情况下,它不会存储在任何位置。您应该查看IdentityServer实现,以获得更健壮的oauth令牌提供程序。