C# 通过提供代理令牌处理来自webapi的长承载令牌

C# 通过提供代理令牌处理来自webapi的长承载令牌,c#,asp.net-web-api,oauth,bearer-token,C#,Asp.net Web Api,Oauth,Bearer Token,我正在使用ASP.NET WebApi 2构建一个web api,使用声明身份验证,我的用户可以拥有大量声明。随着大量的声明,承载令牌增长非常快,因此我试图找到一种返回更短承载令牌的方法 到目前为止,我发现我可以向OAuth选项OAuthAuthorizationServerOptions提供IAAuthenticationTokenProvider。AccessTokenProvider属性: OAuthOptions = new OAuthAuthorizationServerOptions

我正在使用ASP.NET WebApi 2构建一个web api,使用声明身份验证,我的用户可以拥有大量声明。随着大量的声明,承载令牌增长非常快,因此我试图找到一种返回更短承载令牌的方法

到目前为止,我发现我可以向OAuth选项
OAuthAuthorizationServerOptions提供
IAAuthenticationTokenProvider
。AccessTokenProvider
属性:

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenExpireTimeSpan = TimeSpan.FromHours(12),
    AccessTokenProvider = new GuidProvider() // <-- here
};
所以我的问题是:

  • 这是一种提供代理密钥代替我的长声明生成令牌的适当(安全)方法吗
  • 在webapi/OAuth堆栈中是否有更好/更容易的地方可以这样做

另一件需要注意的事情是,我打算支持刷新令牌,事实上,上面的示例是从对刷新令牌使用这种机制的示例中提取出来的-除了刷新令牌之外,它们似乎是一次性使用的,因此,
ReceiveAsync
方法通常会删除从
ConcurrentDictionary
提供的刷新令牌,我不完全确定我是否理解原因?

我不建议这样做,因为您最终会将身份验证票证存储到数据库或Redis服务器中,这里的引申是,对于每个包含承载令牌的请求,您将检查这个永久存储,以便解析Guid并再次获取票证来构造它

我建议您使用JSON Web令牌JWT而不是默认的承载访问令牌格式,为此,您需要在
OAuthorizationServerOptions
的属性
Provider
中实现自定义访问令牌格式
CustomOAuthProvider
,如下代码:

 OAuthAuthorizationServerOptions OAuthServerOptions = new OAuthAuthorizationServerOptions()
        {
            //For Dev enviroment only (on production should be AllowInsecureHttp = false)
            AllowInsecureHttp = true,
            TokenEndpointPath = new PathString("/oauth2/token"),
            AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(30),
            Provider = new CustomOAuthProvider(),
            AccessTokenFormat = new CustomJwtFormat("http://jwtauthzsrv.azurewebsites.net")
        };
我注意到,向JWT令牌添加更多声明不会像默认访问令牌格式那样显著增加其大小

下面是两个JWT的样本,每个JWT内有不同的声明,第二个JWT仅比第一个JWT大50个字符。我建议您使用 第一JWT:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6InRhaXNlZXIiLCJzdWIiOiJ0YWlzZWVyIiwicm9sZSI6WyJNYW5hZ2VyIiwiU3VwZXJ2aXNvciJdLCJpc3MiOiJodHRwOi8vand0YXV0aHpzcnYuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOiIwOTkxNTNjMjYyNTE0OWJjOGVjYjNlODVlMDNmMDAyMiIsImV4cCI6MTQxODY0NzMyNywibmJmIjoxNDE4NjQ1NTI3fQ.vH9XPtjtAv2-6SwlyX4fKNJfm5ZTVHd_9a3bRgkA_LI
第二次联合工作组(更多索赔):

JWT格式正在成为发布OAuth 2.0承载令牌的标准方式,它也将与刷新令牌授权一起使用。但是请记住,JWT只是经过签名的令牌,而不是像默认访问令牌格式那样进行加密,因此不要在中存储机密数据

我已经在bitoftech.net上写了关于如何在ASP.net Web API中使用JWT令牌以及一个实时演示API的文章,如果您需要更多帮助,请随时查看并告诉我


祝你好运

如果您的客户端将重新发送此授权,则此方法很好。如果您使用此方法处理OAuth2中的访问令牌,则返回访问令牌。jet将不是正确的选择,因为授权可以与客户端应用程序隔离,并且您无法从代理令牌推断声明。@jamiec回答了我的问题使用JWT帮助您缩短了充满索赔的访问令牌?@TaiseerJoudeh-它有,它没有。虽然它并没有直接回答我的问题,但它给了我一条新的途径去探索,而我才刚刚接触到它。谢谢你的回答,我希望现在可以接受一半的赏金。我可以考虑在新的一年里对这一问题给予额外的赏赐。你提到JWT的工作是用新鲜的令牌。你能详细说明一下吗?现在,我有一个实现,它将给我一个JWT作为我的访问令牌,在相同的响应中,它包括一个更小的令牌(guid),它是我的刷新令牌。这是正确的过程还是刷新令牌也应该是具有更长生命周期的JWT?否刷新令牌只是存储在数据库中的受保护票证的标识符,您使用grant_type=refresh_令牌表示此标识符,如果它有效(未从DB中删除且未过期),您将收到新的JWT访问令牌,希望清楚,这是有道理的。谢谢
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6InRhaXNlZXIiLCJzdWIiOiJ0YWlzZWVyIiwicm9sZSI6WyJNYW5hZ2VyIiwiU3VwZXJ2aXNvciJdLCJpc3MiOiJodHRwOi8vand0YXV0aHpzcnYuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOiIwOTkxNTNjMjYyNTE0OWJjOGVjYjNlODVlMDNmMDAyMiIsImV4cCI6MTQxODY0NzMyNywibmJmIjoxNDE4NjQ1NTI3fQ.vH9XPtjtAv2-6SwlyX4fKNJfm5ZTVHd_9a3bRgkA_LI
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1bmlxdWVfbmFtZSI6InRhaXNlZXIiLCJzdWIiOiJ0YWlzZWVyIiwicm9sZSI6WyJNYW5hZ2VyIiwiU3VwZXJ2aXNvciIsIlN1cGVydmlzb3IxIiwiU3VwZXJ2aXNvcjIiLCJTdXBlcnZpc29yMyJdLCJpc3MiOiJodHRwOi8vand0YXV0aHpzcnYuYXp1cmV3ZWJzaXRlcy5uZXQiLCJhdWQiOiIwOTkxNTNjMjYyNTE0OWJjOGVjYjNlODVlMDNmMDAyMiIsImV4cCI6MTQxODY0NzQ1NiwibmJmIjoxNDE4NjQ1NjU2fQ.TFEGDtz1RN8VmCQu7JH4Iug0B8UlWDLVrIlvc-7IK3E