在ASP.NET WebAPI中检索承载令牌

本文关键字:令牌 检索 ASP NET WebAPI | 更新日期: 2023-09-27 18:21:25

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

我可以通过调用寄存器令牌方法来创建令牌,但我想从代码中完成这一操作。

  1. 据我所知,承载令牌没有存储在数据库中。是否可以使用ASP.NET Identity API以某种方式检索它?

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

在ASP.NET WebAPI中检索承载令牌

如果您只有一个客户端可以与您的API对话,我不建议使用这种方法,我的理解是,您需要发布一个非常长期的访问令牌,可能需要一年,并继续使用此令牌访问后端API,对吗?如果这个代币被盗,你会怎么办?你不能撤销访问令牌,所以它在某种程度上就像你的主密钥(密码)。我的建议是使用OAuth刷新令牌和访问令牌。这取决于你的客户类型,你可以在这里查看是如何做到的http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/刷新令牌可以被撤销,并且它们可能在很长一段时间后过期。如果您需要进一步的细节来实现这一点,请告诉我。

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

  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);
        }
    }

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

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