Как я могу разрешить 401 несанкционированный в угловой? - PullRequest
1 голос
/ 09 апреля 2019

Я создаю .Net Core API и настраиваю аутентификацию Windows. В моем угловом приложении я должен указывать в каждом запросе эту опцию withCredentials : true. Я делаю запрос пут, но он возвращает мне:

401 (Несанкционированный) 401 unauthorized 401 network

Я также пытаюсь отправить запрос по почте, и он работает не только при получении запроса.

auth.service.ts:

updateUser(id,lastlogin,ac,lastlogoff,picture){
  return this.http.put(`${this.config.catchApiUrl()}User/`+ id , {
    id : id ,
    picture : picture,
    lastLogin : lastlogin ,
    lastLogoff : lastlogoff ,
    ac: ac
  },{
    headers : this.header,
    withCredentials : true
  })
}

auth.component.ts:

constructor(
private authService : AuthenticationService
) { }

loginToApplication(username :string){
    this.authService.updateUser(e["id"],lastLogin,e["ac"],e["lastLogoff"],e["picture"]).subscribe(
        console.log("enter"))
}

.NET Core API Update пользовательский контроллер:

[AllowAnonymous] // Even if I do this it doesn't work
[HttpPut("{id}")]
public async Task<ActionResult<User>> UpdateUser(int id, User user)
{
   try { 

        var ldapPath = Environment.GetEnvironmentVariable("path");
        var ldapUsername = Environment.GetEnvironmentVariable("user");
        var ldapPassword = Environment.GetEnvironmentVariable("psw");

        DirectoryEntry Ldap = new DirectoryEntry(ldapPath, ldapUsername, ldapPassword);

        DirectorySearcher searcher = new DirectorySearcher(Ldap);

        var users = await _context.Users.Include(t => t.Access).FirstOrDefaultAsync(t => t.Id == id);
        if (users == null)
        {
            return StatusCode(204);
        }

        if(users.Ac== 1 && user.Ac!= 1)
        {
            return BadRequest("You can't change an administrator profile");
        }

        searcher.Filter = "(SAMAccountName=" + users.Login.ToLower() + ")";

        SearchResult result = searcher.FindOne();

        if (result == null)
        {
            return NoContent();
        }

        DirectoryEntry DirEntry = result.GetDirectoryEntry();
        user.Lastname = DirEntry.Properties["sn"].Value.ToString();
        user.Fullname = DirEntry.Properties["cn"].Value.ToString();
        user.Firstname = DirEntry.Properties["givenname"].Value.ToString();
        user.Login = DirEntry.Properties["samaccountname"].Value.ToString().ToLower();
        user.Email = DirEntry.Properties["mail"].Value == null ? "No mail" : DirEntry.Properties["mail"].Value.ToString(); ;

        _context.Entry(users).CurrentValues.SetValues(user);
        _context.SaveChanges();
        return users;
        }
    catch (Exception ex)
    {
       return StatusCode(204,ex.Message);
    }

}

Даже если я добавлю [AllowAnonymous] в верхней части контроллера, он не будет работать.

UPDATE: У меня есть Cors в моем проекте, startup.cs в ConfigureServices:

services.AddCors(options =>
{
    options.AddPolicy("AnyOrigin", builder =>
    {
        builder
            .AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials();
    });
});

in Configure:

app.UseCors("AnyOrigin");

Более того, если я хочу проверить почтальона, у меня есть эта ошибка (также в запросе get, но в моем проекте работает запрос get)

401 - Несанкционировано: доступ запрещен из-за неверных учетных данных. У вас нет разрешения на просмотр этого каталога или страницы с использованием предоставленных вами учетных данных.

Когда я нахожусь на моем веб-сайте API (я использую чванство), у меня есть это:

Ваше соединение не является частным

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Вам необходимо настроить CORS для вашего веб-API.

Ссылка https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-2.2 и ссылка Как включить CORS в ASP.NET Core

0 голосов
/ 09 апреля 2019

Перво-наперво: вы можете сделать авторизованный запрос, скажем, с помощью такого инструмента, как Postman? Если да, тогда посмотрите на заголовки запроса (и, возможно, полезную нагрузку) в правильном и выясните, чего не хватает в том, который был отправлен Angular.

Кроме того, у вас есть ошибка CORS в консоли (среди прочего). Быстрое (и грязное) исправление будет состоять в том, чтобы включить CORS на стороне пользователя (есть дополнение CORS Anywhere для Firefox и некоторые параметры командной строки для Chrome) и проверить еще раз.

Попробуйте это.

...