如何自定义 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);
希望对您有所帮助。
上下文
我有一个可用的 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);
希望对您有所帮助。