2016-12-02 98 views
0

我已经按照本教程中实现ASP.NET身份验证和OAuth授权:http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/的OAuth的理解存储令牌

它目前的工作,但我不完全理解令牌,它的计时器的存储位置。

这是生成令牌代码:

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身份DB或托管的Web API应用程序中,但我不完全理解。

+1

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

回答

1

令牌只能由供应商产生的一次,它不存储任何地方。这包含3 ns应用程序需要验证请求的信息,仅此而已。

假设你使用JSON网络令牌或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所以当你需要,你可以轻松地请求另一个。

1

令牌不存储。请求令牌的用户需要能够在每个请求上传递令牌以进行经过认证的调用。因此,为了做到这一点,客户有责任存储令牌。 (这可能是内存中的短期会话或磁盘上/数据库中的更长寿命会话

由于客户端在每个请求上传递令牌,所以服务器不需要存储令牌。有人可能会将它存储在服务器上的数据库中,并检查令牌是否存在。使用这种机制,您可以通过从数据库中删除令牌来撤消令牌,但还有其他方法可以执行此操作。通过定时器我想你指的是令牌的使用寿命,这是通过在每次请求的框架检查,所以没有实际的定时器。