首页 新闻 搜索 专区 学院

asp.net webapi JWTBearer认证

0
悬赏园豆:10 [已解决问题] 解决于 2019-12-07 18:17

有在.net framework 框架项目里接入过JWTBearer认证吗?有没有参考,提供下思路,不知道咋接入这验证。注意是.net framework4.6,不是.net core

凉夏诺浅的主页 凉夏诺浅 | 菜鸟二级 | 园豆:224
提问于:2019-12-05 14:55
< >
分享
最佳答案
0

你这个其实不叫JWTBearer认证,你应该寻找的是webapi接入ids4

收获园豆:10
心雨纷扬 | 菜鸟二级 |园豆:309 | 2019-12-06 13:49

嗯 请问下你对这个熟吗?现在是验证通过了,但是想知道能不能在owin里判断出这个tokens是验证通过的还是没验证通过的

凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-07 09:53

@凉夏诺浅: 你参考的我给的url是做的吗?你可以在前端接收结果的时候统一判断401状态。然后做跳转登录。

心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-12-07 10:04

@心雨纷扬: 差不多是参考你的,我这个项目是在公司其他人做的项目基础上接入的一个验证,但是他以前做的是自己的一套验证,然后把获取到的用户信息赋给了上下文,要是照我这样改的话里面项目原有的逻辑可能就要改动好多了,我想能不能也像他做的那样验证通过之后赋给请求的上下文

凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-07 11:04

@凉夏诺浅: 你这个验证通过以后,理论上是可以通过请求里获取到这个相关的Claims,就可以附加到你的进程里。

心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-12-07 11:20

@心雨纷扬: 这个验证不是在AuthorizeAttribute里进行验证成功的吗?在这验证成功的就要在方法上加上【Authorize】然后相关的Claims就要从控制器里去拿了,我怎样处理能够在Golbal里获取到呢

凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-07 11:30

这里可以获取,你可以自己使用ApiController的User属性去获取,你可以加一个基类,继承ApiController,然后处理User相关东西

心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-12-07 11:39

@心雨纷扬: 在控制器里是能获取,要是在控制器里获取需要改动的东西太多了,我想的是能不能在Global 里进行处理然后赋值给上下文

凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-07 11:51

@凉夏诺浅:。。你试过在你的上下文里点User没有???

心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-12-07 13:42

@心雨纷扬: 试过了,能拿到,但是莫名的会报错,不知道哪的问题,调用控制器里的方法返回
Error getting value from 'ReadTimeout' on 'Microsoft.Owin.Host.SystemWeb.CallStreams.InputStream'. 给注释了还是报这个错,刚开始还能好好的运行,然后也没改什么就成这样了

凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-07 18:12

@凉夏诺浅: 什么鬼。。。。有代码么。。。

心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-12-09 08:54

@心雨纷扬: 已经解决了,接口的问题,谢谢你啦

凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-12 17:55
其他回答(2)
0

private bool IsTokenValid(string token)
{
if (string.IsNullOrEmpty(token))
{
return false;
}
string secret = ConfigurationManager.AppSettings[AppSettingKeys.JwtSecret.ToString()];
if (string.IsNullOrEmpty(secret))
{
throw new Exception("JwtSecret 未在web.config中配置");
}

        try
        {
            var payload = new JwtBuilder()
            .WithSecret(secret)
            .MustVerifySignature()
            .Decode<IDictionary<string, dynamic>>(token);
            long userId = payload["iss"];
            
        }
        //catch(JWT.InvalidTokenPartsException)
        //{
        //    return false;
        //}
        ////token 过期
        //catch (JWT.TokenExpiredException )
        //{
        //    return false;
        //}
        catch(Exception exc)
        {
            NLog.LogManager.GetCurrentClassLogger().Error(exc);
            return false;
        }

        return true;
    }
wwr01 | 园豆:641 (小虾三级) | 2019-12-05 15:29

这是需要解密的密钥然后对获取的jwt进行解密吗?

支持(0) 反对(0) 凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-05 15:34

@凉夏诺浅: 是的

支持(0) 反对(0) wwr01 | 园豆:641 (小虾三级) | 2019-12-05 16:08

string toekenValidSpanStr = ConfigurationManager.AppSettings[AppSettingKeys.TokenExpiredSpan.ToString()];
//token的有效时长(单位:小时)
int toekenValidSpan = int.Parse(toekenValidSpanStr);
//生成JWT
var secret = ConfigurationManager.AppSettings[AppSettingKeys.JwtSecret.ToString()];
if (string.IsNullOrEmpty(secret))
{
throw new Exception("参数JwtSecret未在web.config配置");
}
var token = new JwtBuilder()
.WithAlgorithm(new HMACSHA256Algorithm())
.WithSecret(secret)
.AddClaim("iss", currUser.Id)
.AddClaim("iat ", DateTimeOffset.Now)
.AddClaim("exp", DateTimeOffset.Now.AddHours(toekenValidSpan).ToUnixTimeSeconds())
.Build();

支持(0) 反对(0) wwr01 | 园豆:641 (小虾三级) | 2019-12-05 16:11

@wwr01: 但是我这是属于客户端,服务端是别人搭建的Ids4,我们的项目又是以前的项目.net framework 4.6.1,我们这边只需要做下验证就行,难不成我还需要找他们要解析的密钥??感觉方向有点错了

支持(0) 反对(0) 凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-06 08:54

@凉夏诺浅: https://learnku.com/articles/10885/full-use-of-jwt

支持(0) 反对(0) wwr01 | 园豆:641 (小虾三级) | 2019-12-06 09:14

@wwr01: php的看不懂

支持(0) 反对(0) 凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-07 09:51
0
小小高 | 园豆:820 (小虾三级) | 2019-12-06 14:33

谢谢

支持(0) 反对(0) 凉夏诺浅 | 园豆:224 (菜鸟二级) | 2019-12-07 09:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册