【问题标题】:Retrieve bearer token in ASP.NET WebAPI在 ASP.NET WebAPI 中检索不记名令牌
【发布时间】:2020-12-22 03:02:19
【问题描述】:

我有一个启用了身份验证的 Web API(不记名令牌)。这是由客户端应用程序调用的,我想保护它不被匿名使用,所以我想创建一个用户并为其创建一个不记名令牌。

我可以通过调用 registertoken 方法来创建令牌,但我想从代码中执行此操作。

  1. 据我所知,不记名令牌未存储在数据库中。可以使用 ASP.NET Identity API 以某种方式检索它吗?

  2. 我还想通过代码创建此用户并将令牌保存在某处,因为我需要将数据库部署到多个服务器。

【问题讨论】:

  • 我希望看到问题的直接答案。我正在做类似的事情,我需要从我的集成测试中生成这个令牌。

标签: c# asp.net-web-api bearer-token


【解决方案1】:

如果您只有一个客户端会与您的 API 对话,我不建议您使用这种方法,我的理解是您需要颁发一个非常长寿命的访问令牌,可能会持续一年,并继续使用此令牌来访问后端 API,对吧? 如果这个令牌被盗了,你会怎么做?您无法撤销访问令牌,因此它有点像您的主密钥(密码)。 我的建议是使用 OAuth 刷新令牌和访问令牌。这取决于您的客户类型,您可以在此处查看这是如何完成的http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/ 刷新令牌可以被撤销,它们可以在很长一段时间后过期。如果您需要更多详细信息来实现此功能,请告诉我。

【讨论】:

  • +1 是一个很好的解决方案和非常有趣的博客。我还没有尝试过,但是是否可以像这篇文章所建议的那样撤销访问令牌以更改安全标记? stackoverflow.com/questions/22755700/…。顺便说一句,感谢您的精彩博客以及现在在 Stackoverflow 上的活跃。
  • 但是如果我有一个旧应用程序,有成千上万的用户使用不记名令牌,我只想让他们有可能将其他会话列入黑名单?我认为在数据库中存储令牌的哈希并每次检查令牌是否被列入黑名单并没有什么害处。但我无法访问原始令牌
【解决方案2】:

创建自定义身份验证属性并为用户存储令牌哈希。一个用户可以拥有多个令牌。然后你可以让用户做他想做的事——在更改密码时注销所有其他会话或有选择地删除会话

  public class CustomAuthAttribute : System.Web.Http.AuthorizeAttribute
    {
        protected override bool IsAuthorized(HttpActionContext context)
        {
            var accessToken = HttpContext.Current.Request.Headers["Authorization"];
            var hash = accessToken.Md5();
            //store the hash for that user 
            //check if the hash is created before the password change or its session was removed by the user
            //store IP address and user agent 
            var isBlackListed = ...
            .....
            return !isBlackListed && base.IsAuthorized(context);

        }
    }

【讨论】:

    【解决方案3】:

    如果您需要在 WebAPI 控制器函数中解码令牌,我发现这很有效:

    String token = Request.Headers.Authorization.Parameter;
    Microsoft.Owin.Security.AuthenticationTicket t = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2020-02-21
      • 2023-03-16
      • 2016-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多