在 [Authorize] 属性期间检查 'Whitelist' Table (ASP.Net MVC5 Web API JWT)
Checking 'Whitelist' Table during [Authorize] Attribute (ASP.Net MVC5 Web API JWT)
我按照这篇文章获得了从 .Net Web 发布的 JWT API
http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
TL;DR
我如何向 Authorize 属性添加额外的逻辑以根据 JWT 中的特定声明检查数据库 table,也许在 JwtBearerAuthenticationOptions 中?
更长的版本...
它可以很好地生成 JWT 并在针对包含授权的控制器发出请求时验证它 header...
基本上,文章没有涉及的是撤销...
经过大量谷歌搜索后,我发现有几种使用 JWT 处理撤销的方法。
我选择了 'Whitelist' 路由,因此创建了一个 table 来存储 UserId、ClientId(受众)和一个包含 JTI 值 (GUID) 的列。
基本上,我想向 [Authorize] 属性添加额外的逻辑,以同时检查此 table 是否为给定的 User 和 ClientId 匹配 JTI...
这是否可行而无需编写自定义 'JWTAuthorize' 属性,因为我很想使用默认值...
我怀疑这是需要在 JwtBearerAuthenticationOptions 中指定的东西?
干杯!
我已经使用 JwtBearerAuthenticationOptions 上的自定义提供程序成功实现了此功能。
提供者继承自IOAuthBearerAuthenticationProvider,然后我专门使用ValidateIdentity方法来处理额外的逻辑。
public Task ApplyChallenge(OAuthChallengeContext context)
{
return Task.FromResult<object>(null);
}
public Task RequestToken(OAuthRequestTokenContext context)
{
return Task.FromResult<object>(null);
}
public Task ValidateIdentity(OAuthValidateIdentityContext context)
{
string userId = // user id from Token...
Guid tokenId = // jti from Token...
string appId = // aud/client id from Token...
//do the DB check here...
if (CheckUserToken(userId, tokenId, appId))
{
return Task.FromResult<object>(null);
}
else
{
context.SetError("unauthorized_access", "The supplied security identity for this user is not valid.");
return Task.FromResult<object>(null);
}
}
然后我在客户端处理错误以决定将用户重定向到哪里等等...
如果有人有任何更好的建议,我很乐意看到他们:)
我按照这篇文章获得了从 .Net Web 发布的 JWT API http://bitoftech.net/2014/10/27/json-web-token-asp-net-web-api-2-jwt-owin-authorization-server/
TL;DR
我如何向 Authorize 属性添加额外的逻辑以根据 JWT 中的特定声明检查数据库 table,也许在 JwtBearerAuthenticationOptions 中?
更长的版本...
它可以很好地生成 JWT 并在针对包含授权的控制器发出请求时验证它 header...
基本上,文章没有涉及的是撤销...
经过大量谷歌搜索后,我发现有几种使用 JWT 处理撤销的方法。
我选择了 'Whitelist' 路由,因此创建了一个 table 来存储 UserId、ClientId(受众)和一个包含 JTI 值 (GUID) 的列。
基本上,我想向 [Authorize] 属性添加额外的逻辑,以同时检查此 table 是否为给定的 User 和 ClientId 匹配 JTI...
这是否可行而无需编写自定义 'JWTAuthorize' 属性,因为我很想使用默认值...
我怀疑这是需要在 JwtBearerAuthenticationOptions 中指定的东西?
干杯!
我已经使用 JwtBearerAuthenticationOptions 上的自定义提供程序成功实现了此功能。
提供者继承自IOAuthBearerAuthenticationProvider,然后我专门使用ValidateIdentity方法来处理额外的逻辑。
public Task ApplyChallenge(OAuthChallengeContext context)
{
return Task.FromResult<object>(null);
}
public Task RequestToken(OAuthRequestTokenContext context)
{
return Task.FromResult<object>(null);
}
public Task ValidateIdentity(OAuthValidateIdentityContext context)
{
string userId = // user id from Token...
Guid tokenId = // jti from Token...
string appId = // aud/client id from Token...
//do the DB check here...
if (CheckUserToken(userId, tokenId, appId))
{
return Task.FromResult<object>(null);
}
else
{
context.SetError("unauthorized_access", "The supplied security identity for this user is not valid.");
return Task.FromResult<object>(null);
}
}
然后我在客户端处理错误以决定将用户重定向到哪里等等...
如果有人有任何更好的建议,我很乐意看到他们:)