401 на каждом CRUD .net Framework API

#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