我有一个启用了身份验证的 Web API(不记名令牌)。这是由客户端应用程序调用的,我想保护它免受匿名使用,所以我想创建一个用户并为其创建一个不记名令牌。
我可以通过调用register和token方法来创建令牌,但我想从代码中做到这一点。
据我所知,不记名令牌未存储在数据库中。可以使用 ASP.NET Identity API 以某种方式检索它吗?
我还想从代码创建此用户并将令牌保存在某处,因为我需要将数据库部署到多个服务器。
我有一个启用了身份验证的 Web API(不记名令牌)。这是由客户端应用程序调用的,我想保护它免受匿名使用,所以我想创建一个用户并为其创建一个不记名令牌。
我可以通过调用register和token方法来创建令牌,但我想从代码中做到这一点。
据我所知,不记名令牌未存储在数据库中。可以使用 ASP.NET Identity API 以某种方式检索它吗?
我还想从代码创建此用户并将令牌保存在某处,因为我需要将数据库部署到多个服务器。
如果您只有一个客户端会与您的 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);