PS。我试图显示所有提到的方法和类的代码,因此也请在下面检查。
按照article中有关JWT的逻辑,我创建了一个 TokenManager.cs 类,该类生成并验证Json Web令牌。我制作了一个 JwtAuthorizeActionFilter.cs 类,它是一个带有OnActionExecutingAsync方法的ActionFilterAttribute,它在请求标头中搜索Authorization令牌并对其进行验证。我在要使用JWT的每种方法上方使用此属性。到目前为止一切顺利-一切正常。我的问题是如何从控制器中的JWT获得索赔:
var username = RequestContext.Principal.Identity.Name;
var email = (RequestContext.Principal.Identity as ClaimsIdentity).FindFirst(ClaimTypes.Email).Value;
var telephone = (RequestContext.Principal.Identity as ClaimsIdentity).FindFirst("Telephone").Value;
这是我如何使用带有Authorize属性的OAuth来获取它们。是否有可能获得这样的索赔?无需实施Owin。现在,我可以通过以下方式获得它们:
var token = TokenManager.GetJwtTokenFromHeader();
var claims = TokenManager.GetPrincipal(token);
var username = claims.Identity.Name;
我在此方法中不喜欢的是,我需要从请求标头中获取令牌,然后将其传递给TokenManager,然后从中选择所需的内容。
以下是一些提到的课程:
public static string GenerateToken(string username)
{
byte[] key = Convert.FromBase64String(Secret);
SymmetricSecurityKey securityKey = new SymmetricSecurityKey(key);
SecurityTokenDescriptor descriptor = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(new[]
{
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Email, "test@test.com"),
}),
Expires = DateTime.UtcNow.AddMinutes(60),
SigningCredentials = new SigningCredentials(securityKey,
SecurityAlgorithms.HmacSha256Signature)
};
JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
JwtSecurityToken token = handler.CreateJwtSecurityToken(descriptor);
return handler.WriteToken(token);
}
在令牌管理器中找到。
public static ClaimsPrincipal GetPrincipal(string token)
{
try
{
var tokenHandler = new JwtSecurityTokenHandler();
var jwtToken = tokenHandler.ReadToken(token) as JwtSecurityToken;
if (jwtToken == null)
return null;
var symmetricKey = Convert.FromBase64String(Secret);
var validationParameters = new TokenValidationParameters()
{
RequireExpirationTime = true,
ValidateIssuer = false,
ValidateAudience = false,
IssuerSigningKey = new SymmetricSecurityKey(symmetricKey)
};
SecurityToken securityToken;
var principal = tokenHandler.ValidateToken(token, validationParameters, out securityToken);
return principal;
}
catch (Exception)
{
//should write log
return null;
}
}
我的猜测是,如果不实现OAuth / Owin并使JWT成为首选的令牌标准,则无法实现。 (很乐意在没有Owin的情况下执行此操作,授权属性-并通过我的自定义身份验证使其更简单)