如何自定义WebApi OAuth令牌验证?

时间:2017-02-15 11:07:27

标签: asp.net-web-api oauth asp.net-web-api2 bearer-token

上下文

我有一个可用的WebApi2应用程序,它使用开箱即用的承载令牌验证,就像在原始的Visual Studio项目模板中一样。

我想将自定义数据添加到生成的令牌中,然后在后续api调用发生的时候检查该自定义数据。

为了举例说明,我想在创建令牌时存储调用者的IP地址,然后在验证令牌时检查使用令牌的调用是否具有相同的IP。

我找到了自定义类

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider

在我的项目中,我也看到OAuthOptions已配置为在启动时使用该自定义类。

我想在哪里添加自定义令牌数据(ip):

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

这里我可以将它作为自定义数据添加到故障单属性中。

问题

但是我不知道用什么方法检查令牌是否有这个数据,并且它与实际呼叫的ip匹配,如果没有,那么认为令牌无效?

1 个答案:

答案 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);
希望它有所帮助。