Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查';白名单';[Authorize]属性期间的表(ASP.Net MVC5 Web API JWT)_C#_Asp.net Mvc_Asp.net Web Api2_Jwt_Owin - Fatal编程技术网

C# 检查';白名单';[Authorize]属性期间的表(ASP.Net MVC5 Web API JWT)

C# 检查';白名单';[Authorize]属性期间的表(ASP.Net MVC5 Web API JWT),c#,asp.net-mvc,asp.net-web-api2,jwt,owin,C#,Asp.net Mvc,Asp.net Web Api2,Jwt,Owin,我根据本文获得了从.NETWebAPI发布的JWTs TL;DR 如何向Authorize属性添加额外的逻辑,以便根据JWT中的特定声明(可能是JWTBeareAuthenticationOptions中的声明)检查数据库表 更长版本… 它可以很好地生成JWT,并在对控制器(包括授权头)发出请求时对其进行验证 基本上,这篇文章没有涉及撤销 经过大量的谷歌搜索,我发现有几种处理JWTs撤销的方法 我选择了“白名单”路由,因此创建了一个表来存储UserId、ClientId(观众)和一个包含JTI

我根据本文获得了从.NETWebAPI发布的JWTs

TL;DR

如何向Authorize属性添加额外的逻辑,以便根据JWT中的特定声明(可能是JWTBeareAuthenticationOptions中的声明)检查数据库表

更长版本…

它可以很好地生成JWT,并在对控制器(包括授权头)发出请求时对其进行验证

基本上,这篇文章没有涉及撤销

经过大量的谷歌搜索,我发现有几种处理JWTs撤销的方法

我选择了“白名单”路由,因此创建了一个表来存储UserId、ClientId(观众)和一个包含JTI值(GUID)的列

基本上,我想向[Authorize]属性添加额外的逻辑,以检查该表中给定用户和客户端ID的匹配JTI

这是可行的,而不必写一个自定义的'JWTAuthorize'属性,因为我很想使用默认的

我怀疑这是需要在JWTBeareAuthenticationOptions中指定的内容


干杯

我已经通过使用服务器上的自定义提供程序成功地实现了这一点

提供程序继承自,然后我专门使用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);
        }
    }
公共任务ApplyChallenge(OAuthChallengeContext) { 返回Task.FromResult(空); } 公共任务请求令牌(OAuthRequestTokenContext上下文) { 返回Task.FromResult(空); } 公共任务ValidateIdentity(OAuthValidateIdentityContext上下文) { 字符串userId=//来自令牌的用户id。。。 Guid tokenId=//来自令牌的jti。。。 字符串appId=//来自令牌的aud/客户端id。。。 //在这里做DB检查。。。 if(CheckUserToken(userId、tokenId、appId)) { 返回Task.FromResult(空); } 其他的 { SetError(“未经授权的_访问”,“为此用户提供的安全标识无效”); 返回Task.FromResult(空); } } 然后我在客户端处理错误,以决定将用户重定向到何处等

如果有人有更好的建议,我很乐意看到:)