C# 理解OAuth令牌的存储
我已经根据本教程实现了ASP.NET身份验证和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
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令牌提供程序。