有在.net framework 框架项目里接入过JWTBearer认证吗?有没有参考,提供下思路,不知道咋接入这验证。注意是.net framework4.6,不是.net core
你这个其实不叫JWTBearer认证,你应该寻找的是webapi接入ids4
嗯 请问下你对这个熟吗?现在是验证通过了,但是想知道能不能在owin里判断出这个tokens是验证通过的还是没验证通过的
@凉夏诺浅: 你参考的我给的url是做的吗?你可以在前端接收结果的时候统一判断401状态。然后做跳转登录。
@心雨纷扬: 差不多是参考你的,我这个项目是在公司其他人做的项目基础上接入的一个验证,但是他以前做的是自己的一套验证,然后把获取到的用户信息赋给了上下文,要是照我这样改的话里面项目原有的逻辑可能就要改动好多了,我想能不能也像他做的那样验证通过之后赋给请求的上下文
@凉夏诺浅: 你这个验证通过以后,理论上是可以通过请求里获取到这个相关的Claims,就可以附加到你的进程里。
@心雨纷扬: 这个验证不是在AuthorizeAttribute里进行验证成功的吗?在这验证成功的就要在方法上加上【Authorize】然后相关的Claims就要从控制器里去拿了,我怎样处理能够在Golbal里获取到呢
这里可以获取,你可以自己使用ApiController的User属性去获取,你可以加一个基类,继承ApiController,然后处理User相关东西
@心雨纷扬: 在控制器里是能获取,要是在控制器里获取需要改动的东西太多了,我想的是能不能在Global 里进行处理然后赋值给上下文
@凉夏诺浅:。。你试过在你的上下文里点User没有???
@心雨纷扬: 试过了,能拿到,但是莫名的会报错,不知道哪的问题,调用控制器里的方法返回
Error getting value from 'ReadTimeout' on 'Microsoft.Owin.Host.SystemWeb.CallStreams.InputStream'. 给注释了还是报这个错,刚开始还能好好的运行,然后也没改什么就成这样了
@凉夏诺浅: 什么鬼。。。。有代码么。。。
@心雨纷扬: 已经解决了,接口的问题,谢谢你啦
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;
}
这是需要解密的密钥然后对获取的jwt进行解密吗?
@凉夏诺浅: 是的
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();
@wwr01: 但是我这是属于客户端,服务端是别人搭建的Ids4,我们的项目又是以前的项目.net framework 4.6.1,我们这边只需要做下验证就行,难不成我还需要找他们要解析的密钥??感觉方向有点错了
@凉夏诺浅: https://learnku.com/articles/10885/full-use-of-jwt
@wwr01: php的看不懂