【问题标题】:How can I resolve 401 unauthorized in angular?如何解决 401 角度未经授权的问题?
【发布时间】:2019-04-09 09:37:01
【问题描述】:

我创建 .Net Core API 并配置 Windows 身份验证。 在我的角度应用程序中,我必须在每个请求中输入此选项withCredentials : true。我做了一个放置请求,但它返回给我:

401(未经授权)

我也尝试过发布请求,但它不能只获得请求工作。

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 更新用户控制器:

[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] 也不起作用。

更新: 我的项目中有 Cors,startup.csConfigureServices

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

Configure:

app.UseCors("AnyOrigin");

此外,如果我想在邮递员上进行测试,我会遇到此错误(也在获取请求中,但在我的项目中获取请求工作)

401 - 未经授权:由于凭据无效,访问被拒绝。 您无权使用您提供的凭据查看此目录或页面。

当我在我的 api 网站上(我使用 swagger)时,我有这个:

你的连接不是私人的

【问题讨论】:

  • 您是否在Startup.csConfigure 方法中将.AllowCredentials() 包含在您的.net 核心api 的CORS 策略中?
  • @Arul 是的,我这样做:services.AddCors(options => { options.AddPolicy("AnyOrigin", builder => { builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials (); }); });
  • 您的 API 部署在哪里?既然您说本地主机上的 api 工作正常,那么您的 api 和您从中访问 api 的客户端是否在同一个域上?
  • @Arul 我的 api 部署在 IIS 上,并且在同一个域中
  • 你解决过这个问题吗?我有同样的情况...尝试了几天来解决它...

标签: angular windows-authentication put asp.net-core-2.1


【解决方案1】:

首先要做的事情是:您可以使用 Postman 之类的工具发出授权请求吗?如果是,请查看正确的请求标头(可能还有有效负载),并找出 Angular 发送的请求标头中缺少什么。

此外,您在控制台中有一个 CORS 错误(除其他外)。一个快速(和肮脏)的修复将是启用 CORS 用户端(Firefox 有一个插件 CORS Anywhere,Chrome 有一些命令行选项),然后再次检查。

试试看。

【讨论】:

  • 我无法在邮递员上对其进行测试,因为我的网站 URL 向我发送:401 - 未经授权:由于凭据无效,访问被拒绝。您无权使用您提供的凭据查看此目录或页面。应所有请求,但当我在 localhost 上尝试我的 api 时,它可以工作
  • 那么 - 问题不在于 Angular,而在于请求,而且似乎是无效的凭据。
【解决方案2】:

【讨论】:

  • 我的 .net 核心项目中已经有了核心:services.AddCors(options => { options.AddPolicy("AnyOrigin", builder => { builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader () .AllowCredentials(); }); });而这个 app.UseCors("AnyOrigin");
【解决方案3】:

我遇到了同样的问题。除了正确设置 Cors 设置之外,我在 Angular 中做了以下操作

创建了一个自定义拦截器以将 withCredentials 选项设置为 true

import { HttpEvent, HttpHandler, HttpInterceptor, HttpRequest } from "@angular/common/http";
import { Injectable } from "@angular/core";
import { Observable } from "rxjs";

@Injectable()
export class CustomInterceptor implements HttpInterceptor { 
    
    intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    
        request = request.clone({
            withCredentials: true
        });
    
        return next.handle(request);
    }
}

将拦截器添加到app.module.ts

providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: CustomInterceptor ,
      multi: true
    }
  ],

在我的 WebAPI 中,我有以下设置

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder =>
                {
                    builder.WithOrigins("http://localhost:4200") //Important
                      .AllowAnyMethod()
                      .AllowAnyHeader()
                      .AllowCredentials(); //Important
                });
        });

app.UseCors("CorsPolicy");

最后确保我在控制器中有 [FromBody] 用于发帖调用

    [HttpPost]
    [Route("AdvanaceCaseSearch")]
    public async Task<IEnumerable<AdvanceCaseResults>> AdvanaceCaseSearch(**[FromBody]** AdvanceCaseSearchParam reportparams)
    {

【讨论】:

    猜你喜欢
    • 2020-01-24
    • 2018-04-16
    • 2016-12-14
    • 2019-01-12
    • 2019-01-06
    • 2021-06-13
    • 2017-03-20
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多