首页 文章

如何验证访问令牌以访问基于令牌的机制中的受保护资源?

提问于
浏览
0

我想做基于令牌的机制,我将拥有支持多个客户端的SPA或移动应用程序 .

Use case of my web service engine and my application:

My web application: 客户将注册其应用程序SPA或移动应用程序 . 他们将在注册时获得客户端ID . 在SPA或移动应用程序的情况下,仅作为密钥的客户端ID将受到损害,因此我只是提供了clientid .

Web service engine: 登录到客户端的相应应用程序后,支持多个客户端管理每个用户的会话 .

所以假设有2个客户将他们的应用程序注册到我的Web应用程序中:

客户端1:MyApp1

客户端2:MyApp2

现在,如果MyApp1有2个用户与John和Stephen,如果他们登录MyApp1,那么我想为那些使用基于令牌的机制的用户管理会话 . 现在,如果John和Stephen想要访问受保护资源,那么他们只能通过有效的accessstoken访问 .

MyApp2也是如此 .

对于基于令牌的机制,我已经看到很多问题仅涉及以下文章:

http://bitoftech.net/2014/06/01/token-based-authentication-asp-net-web-api-2-owin-asp-net-identity/

但是上面教程和大多数教程中唯一的混淆部分是在验证用户名和密码并生成访问令牌之后 . 上面的教程是否在服务器端cookie中存储访问令牌,以便在请求访问受保护资源时验证accessstoken?

我真的很困惑 . 我知道在[Authorize属性]中发生了accessstoken验证,但是我没有在没有存储accessstoken的情况下得到如何在教程上验证accesstoken .

我的想法就像可能是当访问受保护资源的请求时,访问令牌是基于webconfig中的机器密钥属性加密或解密的,这就是在[Authorize]属性中验证访问令牌的方式,但我不确定这一点 .

3 回答

  • 2

    应用程序不需要存储访问令牌服务器端,它只会从传递的令牌中读取用户 .

    当请求到达身份验证服务器(附加到ConfigureOAuth()方法中的Owin管道时),HTTP标头令牌被解密,来自令牌的用户数据将被坐到上下文的当前用户 .

  • 1

    您可以控制令牌内的信息 . 查看文章中的SimpleAuthorizationServerProvider类:

    var identity = new ClaimsIdentity(context.Options.AuthenticationType);
    identity.AddClaim(new Claim("sub", context.UserName));
    identity.AddClaim(new Claim("role", "user"));
    

    使用声明存储您需要的与用户,用户名或角色有关的任何内容,这就是您所引用的文章中发生的情况 . 生成的令牌已包含有关用户的信息 .

    这取自文章:

    第二种方法“GrantResourceOwnerCredentials”负责验证发送到授权服务器的令牌 endpoints 的用户名和密码,因此我们将使用我们之前创建的“AuthRepository”类并调用方法“FindUser”来检查用户名和密码是有效的 . 如果凭证有效,我们将创建“ClaimsIdentity”类并将认证类型传递给它,在我们的案例中为“bearer token”,然后我们将添加两个声明(“sub”,“role”),这些将包括在内在签名的令牌中 . 您可以在此处添加不同的声明,但令牌大小肯定会增加 .

    这就是您不需要将令牌存储在任何位置的原因,令牌是自包含的,并且所有内容都以加密形式存储在其中 . 不要忘记,在添加包含用户名的声明之前,您已经验证了用户名和密码,因此您可以保证为有效的用户/密码组合正确创建令牌 . 当然,您不希望将密码存储在令牌内,令牌的整个要点是避免这样做 . 将密码始终传递给API确实增加了被盗的风险,令牌更好 .

    最后,令牌在你控制的一段时间后到期,通常它们是短暂的,所以即使有人确实拿到了它们也不会持续很长时间 .

    如果您通过https呼叫处理授权标头的方式,请注意如何传递令牌,那么您将受到保护,并且标头将被加密 . 这里的要点是永远不要在基本的http上发出这样的调用 .

    您引用的文章的作者是该特定领域备受尊重的权威,目前是Microsoft MVP,您基本上处于良好的状态 . 继续阅读他的文章,但要注意细节 .

    -----------与JWT格式相关的澄清--------------

    是的,JWT令牌将包含与其发布日期和到期日期相关的信息 . 我有一篇关于此的文章:https://eidand.com/2015/03/28/authorization-system-with-owin-web-api-json-web-tokens/

    查看创建令牌的调用并查看屏幕截图中返回的信息 .

    在我的示例中,令牌包含实际的加密令牌,令牌类型,它到期的秒数,作为ClientID的受众,发布时间以及何时到期 .

    这只是一个令牌的例子,你的看起来可能有点不同,但你得到了我希望的想法 . 使用邮递员查看令牌中的内容

    在涉及到OAuth2时,有许多概念需要理解,它确实需要一些研究和实践 .

    简而言之,你要求一个带有A Basic Authorization Header的令牌,你得到令牌,它告诉你它是什么类型,在我的情况下它是Bearer,所以这是我的下一个授权标头,用于对受保护资源的任何调用 .

    我的建议是从小开始,一步一步,使用邮递员 Build 你的电话,并了解正在发生的事情 . 一旦掌握了这些知识,就会更容易进步 . 花了我大约6个星期的时间围绕所有概念,让我的第一次工作变得有效,但现在最多需要几个小时 . 祝好运

  • 1

    这是困扰我很长时间的事情之一

    我不确定我理解为什么你为2个应用程序提供了一个例子,但令牌机制实际上很简单,但当你使用owin和identity时它有点黑盒子

    令牌未存储在服务器或数据库的任何位置,在登录时对用户进行身份验证是使用您的逻辑完成的,或者通常再次使用黑盒子标识,这涉及验证安全密码等

    在此之后生成令牌(通常使用身份)或者如果您手动执行此操作,这将涉及使用您要在其中存储的任何信息来保护令牌

    当用户下次发送请求时,他应该传递令牌并且您需要解密它并验证必要的内容(例如到期时间),所有这些都是在场景后面完成的

    只是一个有趣的注意事项:即使您完全更改了数据库,令牌仍然有效,并且新数据库中甚至不存在用户ID!但当然,与securityStamp进行比较时,身份会自动使此令牌无效

相关问题