如何解决假冒用户在 JWT 中嵌入了错误的详细信息
我正在使用以下服务来获取 JWT 令牌以模拟用户。
[Authenticate]
[RequiredRole(nameof(UserRoles.Admin))]
public class ImpersonateUserService : Service
{
private static ILog Log = LogManager.GetLogger(typeof(ImpersonateUserService));
public ImpersonateUserResponse Any(ImpersonateUserRequest request)
{
var user = Db.SingleById<UserAuthCustom>(request.UserId);
using (var service = base.ResolveService<AuthenticateService>()) //In Process
{
var resp = service.PostAsync(new Authenticate
{
provider = AuthenticateService.CredentialsProvider,UserName = user.UserName ?? user.Email,UseTokenCookie = true,// if using JWT
}).Result;
var token = ((AuthenticateResponse)resp).BearerToken;
return new ImpersonateUserResponse()
{
Success = true,Token = token,Email = user.Email,DisplayName = user.DisplayName,UserId = user.Id,UserRole = (UserRoles)Enum.Parse(typeof(UserRoles),user.Roles[0]),UserName = user.UserName ?? user.Email
};
}
}
}
public class ImpersonateUserRequest : IReturn<ImpersonateUserResponse>
{
public int UserId { get; set; }
}
public class ImpersonateUserResponse : ApiMessage
{
public string Token { get; set; }
public string Email { get; set; }
public string DisplayName { get; set; }
public string UserName { get; set; }
public int UserId { get; set; }
public UserRoles UserRole { get; set; }
}
问题在于,当使用令牌时,它会吸收管理员详细信息,而不是模拟用户。如果我解码模拟令牌,我可以看到:
{
"sub": 1,"iat": 1623677160,"exp": 1624886760,"email": "email@example.com","given_name": "admin name","name": "admin name","roles": [
"Admin"
],"jti": 9
}
此令牌将允许我根据模拟的用户角色(即针对“用户”角色而不是管理员进行身份验证的端点)访问端点,但会在请求 SessionAs<CustomUserSession>
时带回管理员详细信息。
获得包含正确详细信息的令牌的最佳方法是什么?
解决方法
要回答我自己的问题,因为文档建议模拟用户不会模拟会话。
为了让它工作,我必须在模拟端点中完全创建 JWT
var user = Db.SingleById<UserAuthCustom>(request.UserId);
var customSession = new CustomUserSession()
{
UserAuthId = user.Id.ToString(),UserName = user.UserName,DisplayName = user.DisplayName,Email = user.Email,IsAuthenticated = true,Roles = user.Roles
};
var jwtProvider = new JwtAuthProvider(Settings)
{
AuthKeyBase64 = Settings.GetString("auth:key")
};
var header = JwtAuthProvider.CreateJwtHeader(jwtProvider.HashAlgorithm);
var body = JwtAuthProvider.CreateJwtPayload(
customSession,issuer: jwtProvider.Issuer,expireIn: jwtProvider.ExpireTokensIn,roles: user.Roles
);
var jwtToken = JwtAuthProvider.CreateJwt(header,body,jwtProvider.GetHashAlgorithm());
return new ImpersonateUserResponse()
{
Success = true,Token = jwtToken,UserId = user.Id,UserRole = (UserRoles)Enum.Parse(typeof(UserRoles),user.Roles[0]),UserName = user.UserName ?? user.Email
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。