#c# #.net #angular #jwt
#c# #.net #angular #jwt
Вопрос:
Итак, у меня есть проект, его api .net Framework и интерфейс angular.
Недавно я добавил аутентификацию OWIN JWT, но, похоже, что все, что я делаю, возвращает ошибку 401. И я перепробовал 100 решений, но безуспешно.
При входе в систему JWT корректно передается во внешний интерфейс.
Мой startup.cs
using System;
using System.Text;
using Microsoft.Owin.Security.Jwt;
using Microsoft.Owin.Security;
using Microsoft.IdentityModel.Tokens;
using System.Threading.Tasks;
using System.Web.Configuration;
using Microsoft.Owin;
using Owin;
[assembly: OwinStartup(typeof(AgriLogBackend.Startup))]
namespace AgriLogBackend
{
public class Startup
{
public void Configuration(IAppBuilder app)
{
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("GuessThePassword----"))
}
});
}
}
}
Мой контроллер имеет атрибут [Authorize].
И я передаю правильный JWT обратно контроллерам, но, похоже, его не удается авторизовать.
Любая помощь приветствуется
В angular я использую сообщение, подобное этому:
const ops = { // <<<<<< Initialize header with token
headers: new HttpHeaders({
'Authorization': 'Bearer ' localStorage.getItem("jwtToken")
})
};
return this.http.get<types>(this.baseURL "EquipmentTypes/" localStorage.getItem("currentFarm"),ops);
Создание токена в c#:
public IHttpActionResult Login(User user)
{
var finduser = db.Users.Where(x => x.User_Email == user.User_Email).FirstOrDefault();
var encPass = encrypt(user.User_Password);
if (finduser != null amp;amp; finduser.User_Password == encPass)
{
var claims = new[]
{
new Claim(ClaimTypes.Name,finduser.User_ID.ToString())
};
var keytoReturn = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_key));
var Credentials = new SigningCredentials(keytoReturn, SecurityAlgorithms.HmacSha512Signature);
var descriptorToken = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = Credentials
};
var Handler = new JwtSecurityTokenHandler();
var userToken = Handler.CreateToken(descriptorToken);
return Ok
(new
{
Token = Handler.WriteToken(userToken)
}
);
}
return Unauthorized();
}
Ответ №1:
Вы настраиваете TokenValidationParameters
следующим образом:
TokenValidationParameters = new TokenValidationParameters()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("GuessThePassword----"))
}
который сообщает промежуточному программному обеспечению JwtBearerAuthentication проверять каждый токен на наличие действительных утверждений эмитента и аудитории ( iss
и aud
в токене).
Поскольку вы не добавили оба утверждения во время создания токена, проверка завершится ошибкой. Ваш выбор — либо отключить эти параметры:
ValidateIssuer = false,
ValidateAudience = false,
чтобы эти проверки не выполнялись, или добавьте соответствующие утверждения для них при создании токена:
var descriptorToken = new SecurityTokenDescriptor
{
Subject = new ClaimsIdentity(claims),
Expires = DateTime.Now.AddDays(1),
SigningCredentials = Credentials
TokenIssuerName = "YourIssuer", // add your issuer here
AppliesToAddress = "YourAudience", // add your audience here
};
var Handler = new JwtSecurityTokenHandler();
var userToken = Handler.CreateToken(descriptorToken);
Ссылка на SecurityTokenDescriptor