mirror of
https://gitee.com/dotnetchina/OpenAuth.Net.git
synced 2026-07-14 03:23:48 +08:00
🐛fix: #IJX34Q 非Identity的token支持jwt token
This commit is contained in:
@@ -36,6 +36,7 @@ namespace OpenAuth.App.SSO
|
||||
|
||||
/// <summary>
|
||||
/// 如果是Identity,则返回信息为用户账号
|
||||
/// 如果是本地认证,则返回JWT Token字符串
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
private string GetToken()
|
||||
@@ -54,6 +55,15 @@ namespace OpenAuth.App.SSO
|
||||
return cookie ?? String.Empty;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 从JWT Token中提取会话ID(jti),用于缓存查找
|
||||
/// </summary>
|
||||
private string GetSessionIdFromToken(string token)
|
||||
{
|
||||
if (string.IsNullOrEmpty(token)) return null;
|
||||
return JwtTokenHelper.GetSessionId(token);
|
||||
}
|
||||
|
||||
public bool CheckLogin(string token = "", string otherInfo = "")
|
||||
{
|
||||
if (_appConfiguration.Value.IsIdentityAuth)
|
||||
@@ -73,7 +83,21 @@ namespace OpenAuth.App.SSO
|
||||
|
||||
try
|
||||
{
|
||||
var result = _cacheContext.Get<UserAuthSession>(token) != null;
|
||||
// 验证JWT Token签名和有效期
|
||||
var principal = JwtTokenHelper.ValidateToken(token, _appConfiguration.Value.JwtSecret);
|
||||
if (principal == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// 检查会话是否在缓存中(确保未被登出失效)
|
||||
var sessionId = GetSessionIdFromToken(token);
|
||||
if (string.IsNullOrEmpty(sessionId))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var result = _cacheContext.Get<UserAuthSession>(sessionId) != null;
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
@@ -95,17 +119,29 @@ namespace OpenAuth.App.SSO
|
||||
return _app.GetAuthStrategyContext(GetToken());
|
||||
}
|
||||
AuthStrategyContext context = null;
|
||||
var user = _cacheContext.Get<UserAuthSession>(GetToken());
|
||||
if (user != null)
|
||||
var token = GetToken();
|
||||
|
||||
// 从JWT Token中直接提取用户账号
|
||||
var account = JwtTokenHelper.GetAccount(token);
|
||||
if (!string.IsNullOrEmpty(account))
|
||||
{
|
||||
context = _app.GetAuthStrategyContext(user.Account);
|
||||
// 验证会话是否有效(未被登出)
|
||||
var sessionId = GetSessionIdFromToken(token);
|
||||
if (!string.IsNullOrEmpty(sessionId))
|
||||
{
|
||||
var session = _cacheContext.Get<UserAuthSession>(sessionId);
|
||||
if (session != null)
|
||||
{
|
||||
context = _app.GetAuthStrategyContext(account);
|
||||
}
|
||||
}
|
||||
}
|
||||
return context;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取当前登录的用户名
|
||||
/// <para>通过URL中的Token参数或Cookie中的Token</para>
|
||||
/// <para>通过JWT Token中的claims直接提取用户账号</para>
|
||||
/// </summary>
|
||||
/// <param name="otherInfo">The account.</param>
|
||||
/// <returns>System.String.</returns>
|
||||
@@ -116,10 +152,21 @@ namespace OpenAuth.App.SSO
|
||||
return _httpContextAccessor.HttpContext.User.Identity.Name;
|
||||
}
|
||||
|
||||
var user = _cacheContext.Get<UserAuthSession>(GetToken());
|
||||
if (user != null)
|
||||
var token = GetToken();
|
||||
// 从JWT Token中提取用户账号
|
||||
var account = JwtTokenHelper.GetAccount(token);
|
||||
if (!string.IsNullOrEmpty(account))
|
||||
{
|
||||
return user.Account;
|
||||
// 验证会话是否有效
|
||||
var sessionId = GetSessionIdFromToken(token);
|
||||
if (!string.IsNullOrEmpty(sessionId))
|
||||
{
|
||||
var session = _cacheContext.Get<UserAuthSession>(sessionId);
|
||||
if (session != null)
|
||||
{
|
||||
return account;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return "";
|
||||
@@ -173,7 +220,12 @@ namespace OpenAuth.App.SSO
|
||||
|
||||
try
|
||||
{
|
||||
_cacheContext.Remove(token);
|
||||
// 从JWT Token中提取会话ID,删除缓存
|
||||
var sessionId = GetSessionIdFromToken(token);
|
||||
if (!string.IsNullOrEmpty(sessionId))
|
||||
{
|
||||
_cacheContext.Remove(sessionId);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
|
||||
Reference in New Issue
Block a user