我正在使用aspnet核心WEB Api应用程序。
登录时我正在通过SignInManager验证用户。
await _signInManager.PasswordSignInAsync
之后我正在为该用户生成jwt令牌。
我在控制器方法中添加了[Authorize]标签。
当我发送带有令牌或无效令牌的请求时,我收到404错误而不是401错误。
这是startup.cs文件
var tp_options = new TokenProviderOptions
{
Audience = xyz,
Issuer = xyz,
SigningCredentials = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256),
};
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
TokenValidationParameters = tokenValidationParameters,
AuthenticationScheme = JwtBearerDefaults.AuthenticationScheme,
});
app.UseStaticFiles();
app.UseFileServer();
app.UseIdentity();
我添加了app.UseIdentity();
。这是signInManger验证登录所必需的。
如果我删除app.UseIdentity()
我收到401错误,但signInManager正在异常“没有配置身份验证处理程序来处理该方案:Identity.Application”
我怎样才能在这里实现这两个功能。我想使用JWT令牌验证和ASP IDENTITY。
答案 0 :(得分:1)
我有同样的问题,并且能够通过不使用SignInManager进行用户身份验证来解决它。似乎SignInManager在内部使用cookie身份验证,未经授权的请求被重定向到我尚未实现的登录页面,因此404响应。
如果您排除app.UseIdentity()并且还排除cookie中间件,则未经授权的请求应返回401响应。以下是用户身份验证代码:
public async Task<ClaimsIdentity> GetIdentity(string username, string password)
{
// Can't use SignInManager because it uses a cookie so requests for unauthorized actions will not return 401,
// it will return 404 (redirect to Login page that is missing)
// instead we validate the user using PasswordHasher
var user = await _userManager.FindByNameAsync(username);
if (user != null)
{
var passwordHasher = new Microsoft.AspNetCore.Identity.PasswordHasher<ApplicationUser>();
var passverificationResult = passwordHasher.VerifyHashedPassword(user, user.PasswordHash, password);
if (passverificationResult == PasswordVerificationResult.Success)
{
var claims = await _userManager.GetClaimsAsync(user);
return new ClaimsIdentity(new GenericIdentity(username, "Token"), claims);
}
}
return null;
}