我有一个启用了身份验证的Web API(承载令牌)。这是由客户端应用程序调用的,我希望保护它免受匿名使用,因此我想创建一个用户并为其创建一个承载令牌。
我可以通过调用 register 和 token 方法来创建令牌,但我想从代码中执行此操作。
据我所知,持票人令牌未存储在数据库中。是否可以使用ASP.NET Identity API以某种方式检索它?
我还希望从代码创建此用户并保存令牌,因为我需要将数据库部署到多个服务器。
答案 0 :(得分:6)
如果您只有一个会与您的API通信的客户端,我不建议采用这种方法,我的理解是您需要签发非常长期存取令牌可能一年并继续使用此令牌访问后面-End API,对吗? 如果此令牌被盗,您会怎么做?您无法撤消访问令牌,因此它有点像您的主密钥(密码)。 我的建议是使用OAuth刷新令牌以及访问令牌。这取决于您的客户类型,您可以在此处查看此操作的完成情况http://bitoftech.net/2014/07/16/enable-oauth-refresh-tokens-angularjs-app-using-asp-net-web-api-2-owin/ 刷新令牌可以被撤销,并且可以在很长时间后过期。如果您需要进一步的细节来实现这一点,请告诉我。
答案 1 :(得分:0)
创建自定义身份验证属性并为用户存储令牌哈希。一个用户可以有多个令牌。然后,您可以让用户做他想做的事情-更改密码后注销所有其他会话,或有选择地删除会话
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);
}
}
答案 2 :(得分:0)
如果您需要在WebAPI Controller函数中对令牌进行解码,我发现这是可行的:
String token = Request.Headers.Authorization.Parameter;
Microsoft.Owin.Security.AuthenticationTicket t = Startup.OAuthOptions.AccessTokenFormat.Unprotect(token);