401:Web API .net core C# 中的未授权问题

Posted

技术标签:

【中文标题】401:Web API .net core C# 中的未授权问题【英文标题】:401: unauthorized issue in Web API .net core C# 【发布时间】:2021-08-10 12:35:54 【问题描述】:
    I am getting JWT Token from the React UI using AcquireTokenSilent of MSAL. Now, I have to call Graph API using this token in Web API(.net core) in C#.
    Before calling the Graph API I am getting "401 :Unauthorized". Please help me in resolving the issue.       
    
    In Startup.cs I am using following code:
    ----------
    public void ConfigureServices(IServiceCollection services)
                
                    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
                        .AddMicrosoftIdentityWebApi(Configuration,"AzureAd")
                            .EnableTokenAcquisitionToCallDownstreamApi()
                                .AddMicrosoftGraph(Configuration.GetSection("DownstreamApi"))
                                .AddInMemoryTokenCaches();
                
        
        
          public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
               
                   app.UseAuthentication();
                   app.UseRouting();
                   app.UseAuthorization();
               
        
       
         In ProfileController.cs
        
         [HttpPost]
                public async Task<ActionResult> PostProfileItem([FromBody]SetProfile setprofile)
                
                     
                    HttpContext.VerifyUserHasAnyAcceptedScope(scopeRequiredByApi);
                     
                    try
                    
                        List<HeaderOption> requestHeaders = new List<HeaderOption>()  new HeaderOption("Authorization", "Bearer " + setprofile.access_token) ;
                        User profile = await _graphServiceClient.Me.Request(requestHeaders).GetAsync();
                
               (catch Exception ex)
                
                
              return Ok(profile);
            
        
            SetProfile.cs
        namespace Web.Dto
        
            public record SetProfile
            
               [NotMapped]
               [JsonProperty("access_token")]
               [Required]
                public string access_token  get; init; 
               
            
        
            
        
    
   
    
    

React UI 代码获取令牌并将访问令牌发布到 ProfileController.cs

if (!graphData && inProgress === InteractionStatus.None) //表单数据实例 let formData = new FormData() //获取令牌静默 instance.acquireTokenSilent(accessTokenRequest) //then 子句 .then((accessTokenResponse ) => // 获取令牌静默成功 let accessToken = accessTokenResponse.accessToken; //记录访问令牌 console.log(access token : $accessToken) //在API中添加访问令牌的代码 formData.append("access_token", accessToken) / /调用配置文件 API props.userProfileCall(formData) ); //捕获错误的代码 ).catch((error) => //记录错误 console.log(error); )

【问题讨论】:

最好向我们展示您的 React 部分。你如何传递令牌? 我已经添加了 React 部分。请帮帮我。 几件事需要确认,您的令牌是否需要您尝试呼叫的graph api 的权限?另一件事是您能否check your token here 仔细检查您的上下文是否有效? 【参考方案1】:

解决方案 1:

1) 要从 Reactjs 访问任何 Web API 或任何 Ajax 方法 Web API 必须启用 CORS

您需要设置 CORS 政策才能调用 Startup.cs 中的 API。

 services.AddCors(o => o.AddPolicy("default", builder =>
    
        builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader();
    )

2) 在您的控制器中,添加 [Authorize] 装饰器,这将确保所有传入请求都有身份验证承载

例子:

 [Authorize]
    [Route("api/[controller]")]
    [ApiController]
    public class TestController : ControllerBase
    
    

解决方案 2: 确保您授予 User.Read.All 应用程序权限。

    登录Azure portal。

    如果您可以访问多个租户,请使用顶部菜单中的 目录 + 订阅 过滤器来选择包含您的客户端应用注册的租户。

    选择 Azure Active Directory > 应用注册,然后选择您的客户端应用程序。

    选择 API 权限 > 添加权限 > Microsoft Graph > 应用程序权限

    Microsoft Graph 公开的所有权限都显示在选择权限下。

    选择User.Read.All并点击添加权限

更多详情请参考document

【讨论】:

以上是关于401:Web API .net core C# 中的未授权问题的主要内容,如果未能解决你的问题,请参考以下文章

当用户未经身份验证时,ASP.NET Core 5 Web API 返回 404 代码而不是 401

Angular2 中的 Http PUT 到 .NET Core Web API 提供来自预检请求的 http 401 错误

.NET Core - 在 IIS 上使用 Windows 身份验证从 MVC 应用程序调用 Web API 导致 HttpRequestException 401(未经授权)状态代码

Angular MSAL AD 401 在 Angular 应用程序中未经授权,但在 Postman 中 200 正常 - ASP.NET Core Web API

.Net Core 6 web api jwt 一直 401 Postman返回WWW-Authenticate Bearer没有其他提示的解决方法

如何诊断尝试在 c# .NET Core 中获取 OAuth2 不记名令牌的 401 错误?