You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API添加[Authorize]后,Web应用如何获取并携带JWT Token实现授权访问

解决ASP.NET Web应用调用带JWT认证的API问题

咱们核心要做的就是两步:先从API获取有效的JWT Token,然后在每次调用API数据接口时,把这个Token放到HTTP请求的Authorization头里。我来帮你一步步修正代码并解释关键细节:

一、先实现获取JWT Token的方法

首先你的API肯定有一个登录接口(比如/api/login)用来返回Token,咱们先写一个异步方法来获取这个Token:

private async Task<string> GetJwtTokenAsync()
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("https://localhost:44304/api/");
        
        // 假设登录请求需要用户名和密码,根据你的API实际参数调整
        var loginData = new { Username = "your_username", Password = "your_password" };
        var response = await client.PostAsJsonAsync("login", loginData);
        
        if (response.IsSuccessStatusCode)
        {
            // 假设API返回的是包含Token的对象,比如 { "token": "xxx..." }
            var tokenResult = await response.Content.ReadAsAsync<dynamic>();
            return tokenResult.token;
        }
        else
        {
            // 处理登录失败的情况,比如抛出异常或者返回空
            throw new Exception("Failed to get JWT token");
        }
    }
}

二、修正调用数据接口的代码

你现在的代码有几个明显问题:

  • 没正确获取Token就尝试设置Authorization头,逻辑顺序完全错了
  • Authorization头的格式错误:Bearer后面必须加空格,你写的"Bearer"+...没有空格,这会直接导致认证失败
  • 用.Wait()阻塞线程,在ASP.NET里推荐用async/await来避免死锁和性能问题

下面是修正后的Index方法:

public async Task<ActionResult> Index()
{
    IEnumerable<OperatorClass> OperatorObject = null;
    
    try
    {
        // 第一步:先获取JWT Token
        var jwtToken = await GetJwtTokenAsync();
        
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri("https://localhost:44304/api/");
            
            // 第二步:把Token添加到Authorization请求头
            client.DefaultRequestHeaders.Authorization = 
                new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", jwtToken);
            
            // 调用数据接口
            var resultDisplay = await client.GetAsync("data");
            
            if (resultDisplay.IsSuccessStatusCode)
            {
                OperatorObject = await resultDisplay.Content.ReadAsAsync<IList<OperatorClass>>();
            }
            else
            {
                OperatorObject = Enumerable.Empty<OperatorClass>();
                ModelState.AddModelError(string.Empty, "No records found or unauthorized access");
            }
        }
    }
    catch (Exception ex)
    {
        OperatorObject = Enumerable.Empty<OperatorClass>();
        ModelState.AddModelError(string.Empty, $"Error occurred: {ex.Message}");
    }
    
    return View(OperatorObject);
}

三、关键知识点解释

  1. Authorization头的正确格式:
    必须是 Bearer 你的JWT Token字符串,Bearer和Token之间的空格非常重要——少了这个空格,API的认证中间件会直接识别失败。

  2. 异步编程的最佳实践:
    在ASP.NET MVC控制器里,把方法返回类型改成Task<ActionResult>,用await代替.Wait(),这样不会阻塞线程,能提升应用的性能和稳定性。

  3. Postman测试建议:
    你可以先用Postman验证流程:

    • 先调用登录接口拿到Token
    • 再调用/api/data接口,在请求头里添加Authorization: Bearer 你的Token,确认能正常返回数据后,再把这个逻辑搬到Web应用里。

四、关于你的API代码

你的API控制器已经加了[Authorize]特性,只要确保API的JWT认证中间件配置正确(比如在Startup里配置了JwtBearer认证服务和中间件),带正确Token的请求就能正常访问接口了。

内容的提问来源于stack exchange,提问作者user14979715

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 06:17:33