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

How to customize WebApi OAuth token validation?

上下文

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

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

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

我找到了习俗class

public class ApplicationOAuthProvider : OAuthAuthorizationServerProvider

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

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

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

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

问题

但是我找不到用什么方法来检查token是否有这个数据,它是否与实际调用的ip匹配,如果没有,则认为token无效?

当您决定实施 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);

希望对您有所帮助。