上下文
我有一个可用的WebApi2应用程序,它使用开箱即用的承载令牌验证,就像在原始的Visual Studio项目模板中一样。
我想将自定义数据添加到生成的令牌中,然后在后续api调用发生的时候检查该自定义数据。
为了举例说明,我想在创建令牌时存储调用者的IP地址,然后在验证令牌时检查使用令牌的调用是否具有相同的IP。
我找到了自定义类
public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider
在我的项目中,我也看到OAuthOptions
已配置为在启动时使用该自定义类。
我想在哪里添加自定义令牌数据(ip):
public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)
这里我可以将它作为自定义数据添加到故障单属性中。
问题
但是我不知道用什么方法检查令牌是否有这个数据,并且它与实际呼叫的ip匹配,如果没有,那么认为令牌无效?
答案 0 :(得分:3)
当你决定实施OAuthAuthorizationServerProvider
时,你是绝对正确的。现在你需要添加这样的东西:
private ClaimsIdentity CreateIdentity(User user, string authenticationType)
{
var identity = new ClaimsIdentity(authenticationType);
identity.AddClaim(new Claim(ClaimTypes.Name, user.Login));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.UserID.ToString())); // or ip instead of user.UserID if you need
return identity;
}
然后在您的Grant...
方法(例如GrantResourceOwnerCredentials
)中使用它,如下所示:
ClaimsIdentity identity = CreateIdentity(user, context.Options.AuthenticationType);
context.Validated(identity);
然后,当您的webapi控制器发出请求时,您可以在自定义属性中检查您的数据:
Claim userIdClaim = ((ClaimsIdentity)actionContext.ControllerContext.RequestContext.Principal.Identity)
.Claims
.FirstOrDefault(c => c.Type == ClaimTypes.NameIdentifier);
希望它有所帮助。