繁体   English   中英

在 ASP.NET WebAPI 中检索不记名令牌

[英]Retrieve bearer token in ASP.NET WebAPI

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

我可以通过调用registertoken方法来创建令牌,但我想从代码中做到这一点。

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

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

如果您只有一个客户端会与您的 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 控制器函数中解码令牌,我发现这有效:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM