在客户端 API 中使用 JWT 令牌

2024-04-19

我在 .NET5 中有一个 API,使用 JWTBearer 来保护 API。现在我想配置我的客户端应用程序以使用从 api/gettoken 生成的令牌。它在 swagger 中工作得很好,但我不知道如何配置我的 MVC 和 API(消费 API)来使用这个令牌。有人可以通过在启动中提供配置服务和配置方法来提供帮助吗

对格伦来说,

我有 3 个项目 JWT.IDP、JWT.API、JWT.MVC。 JWT.IDP 颁发令牌,我的目的是在 JWT.API 中使用该令牌并从 JWT.MVC 调用 JWT.API 函数。 IDP 工作正常,我可以生成令牌,并且我的 JWT.MVC 登录控制器能够接收它。下面代码中的最后一个函数(GetWeatherData)是根据您给出的想法进行编码的。如果我不传递令牌,以前会收到 401 错误,现在会收到 500 内部服务器错误

namespace JWT.MVC.Controllers
{
    public class LoginController : Controller
    {

        public IActionResult DoLogin()
        {

            return View();
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> DoLogin([Bind("EmailOrName,Password")] LoginRequestModel loginRequestModel)
        {
            var apiName = $"https://localhost:44318/api/User/login";

            HttpClient httpClient = new HttpClient();
            HttpResponseMessage response = await httpClient.PostAsJsonAsync(apiName, loginRequestModel);
            var jasonString = await response.Content.ReadAsStreamAsync();

            var data = await JsonSerializer.DeserializeAsync<IEnumerable<AccessibleDb>>
                    (jasonString, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });

            foreach (var item in data)
            {
                item.UserName = loginRequestModel.EmailOrName;
            }

            return View("SelectDatabase" , data);
        }

      
        public async Task<IActionResult> PostLogin(string db, string user)
        {
            TokenRequestModel tokenRequestModel = new TokenRequestModel() { Database = db, UserName = user };

            var apiName = $"https://localhost:44318/api/User/tokenonly";

            HttpClient httpClient = new HttpClient();
            HttpResponseMessage response = await httpClient.PostAsJsonAsync(apiName, tokenRequestModel);
            var jasonString = await response.Content.ReadAsStreamAsync();

            var data = await JsonSerializer.DeserializeAsync<AuthenticationModel>
                    (jasonString, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });

            var stream = data.Token;
            var handler = new JwtSecurityTokenHandler();
            var jsonToken = handler.ReadToken(stream);
            var tokenS = jsonToken as JwtSecurityToken;
            var selectedDb = tokenS.Claims.First(claim => claim.Type == "Database").Value;

            ViewBag.SelectedDb = selectedDb;

            return View(data);
        }

        public async Task<IActionResult> GetWeatherData(string token)
        {

            var apiName = $"https://localhost:44338/weatherforecast";

            HttpClient httpClient = new HttpClient();
            httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token);
            HttpResponseMessage response = await httpClient.GetAsync(apiName);
            if (!response.IsSuccessStatusCode)
            {
                ViewBag.Error = response.StatusCode;
                return View("Weatherdata");
            }
            var jasonString = await response.Content.ReadAsStreamAsync();
            var data = await JsonSerializer.DeserializeAsync<WeatherForecast>
                    (jasonString, new JsonSerializerOptions() { PropertyNameCaseInsensitive = true });

        
            return View("Weatherdata" , data);
        }
    }
}

JWT.MVC的启动类如下


 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();
            services.AddAuthentication("Bearer")
             .AddJwtBearer("Bearer", options =>
             {

                 options.Audience = "SecureApiUser";
                 options.Authority = "https://localhost:44318";
                 options.TokenValidationParameters = new TokenValidationParameters
                 {
                     ValidateAudience = false
                 };
             });

          
        }


JWT.API的启动类如下

  public void ConfigureServices(IServiceCollection services)
        {

            services.AddControllers();
            //Copy from IS4
            services.AddAuthentication("Bearer")
              .AddJwtBearer("Bearer", options =>
              {
                  
                  options.Audience = "SecureApiUser";
                  options.Authority = "https://localhost:44318";
                  options.TokenValidationParameters = new TokenValidationParameters
                  {
                      ValidateAudience = false
                  };
              });

          
            //End
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "JWT.API", Version = "v1" });
            });
        }

JWT.IDP的启动类如下

  public void ConfigureServices(IServiceCollection services)
        {

            services.AddControllers();

            //Configuration from AppSettings
            services.Configure<JwtSettings>(Configuration.GetSection("JWT"));
            //User Manager Service
            services.AddIdentity<ApplicationUser, IdentityRole>().AddEntityFrameworkStores<IdentityDbContext>();
            services.AddScoped<IUserService, UserService>();
            //Adding DB Context with MSSQL
            services.AddDbContext<IdentityDbContext>(options =>
                options.UseSqlServer(
                    Configuration.GetConnectionString("IdentityDbConnectionString"),
                    b => b.MigrationsAssembly(typeof(IdentityDbContext).Assembly.FullName)));

            //Adding Athentication - JWT
            services.AddAuthentication(options =>
            {
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
                .AddJwtBearer(o =>
                {
                    o.RequireHttpsMetadata = false;
                    o.SaveToken = false;
                    o.TokenValidationParameters = new TokenValidationParameters
                    {
                        ValidateIssuerSigningKey = true,
                        ValidateIssuer = true,
                        ValidateAudience = true,
                        ValidateLifetime = true,
                        ClockSkew = TimeSpan.FromMinutes(Convert.ToInt32(Configuration["JWT:DurationInMinutes"])),
                        ValidIssuer = Configuration["JWT:Issuer"],
                        ValidAudience = Configuration["JWT:Audience"],
                        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["JWT:Key"]))
                    };
                });

           

            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "JWT.IDP", Version = "v1" });
            });
        }

JWT 设置如下

 "JWT": {
    "key": "C1CF4B7DC4C4175B6618DE4F55CA4",
    "Issuer": "http://localhost:44318",
    "Audience": "SecureApiUser",
    "DurationInMinutes": 60
  },

简短的答案是

httpClient.DefaultRequestHeaders.Authorization =
  new AuthenticationHeaderValue("Bearer", [token])

保持“Bearer”不变,它只是一个常数。将 [token] 替换为从您正在使用的 OAuth 协议返回给我们的 Base 64 编码令牌值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在客户端 API 中使用 JWT 令牌 的相关文章

随机推荐

  • 计算编辑距离的最有效方法

    我刚刚实现了最佳匹配文件搜索算法来查找与字典中的字符串最接近的匹配项 对我的代码进行分析后 我发现绝大多数时间都花在计算查询与可能结果之间的距离上 我目前正在实现使用二维数组计算编辑距离的算法 这使得实现成为 O n 2 操作 我希望有人能
  • 在 Gulp 中将流与事件流连接时的顺序

    在此 Gulp 任务中 vendorFiles 代码放置在 dest style css 文件中的 appFiles 代码之后 这是因为 appFiles 流运行得更快吗 如何让vendorFiles代码按预期出现在前面 gulp task
  • 从线程内更新网页

    我有一个运行冗长过程的网页 除了在页面上显示进度之外 所有这些都在工作 我有以下进度条 引导程序 div class col md 8 div
  • 如何在 WPF 中使用 MVVM 从另一个视图打开一个视图

    我是 MVVM 新手 很长一段时间以来我都无法得到这个问题的答案 不知道是问题太难还是我没有解释清楚 我有 MainWindow Xaml 其中包含一个文本块和一个用于从文本块接收数据的按钮 现在当我按下按钮时 它应该打开第二个名为 tab
  • JavaFx 如何避免创建一个巨大的控制器

    我在 JavaFX 中有一个应用程序 它有带有菜单和工具栏的主场景 以及在按下菜单按钮之一后注入到该主场景中的较小场景 现在 HomeCntroller 负责场景组件 主场景 带有工具栏和菜单 和注入场景 如果注入的场景数量超过一个 这会导
  • kotlin 中的 init 块和构造函数有什么区别?

    我已经开始学习 Kotlin 了 我想知道之间的区别init块和constructor 这之间有什么区别以及我们如何利用它来改进 class Person constructor var name String var age Int va
  • 搭建控制器时引发的调用目标已引发异常

    我创建了一个单独的类库项目来存储数据库上下文和模型类 在同一解决方案中 我创建了一个 ASP NET MVC 项目并引用了类库项目 并在项目的 Web config 文件中包含了数据库上下文的连接字符串 但是 当我尝试添加控制器 带有视图
  • NIntegrate - 为什么在这种情况下 Mathematica 8 的速度要慢得多?

    我有一个 Mathematica 代码 我必须在数值上评估数千个与此类似的积分 NIntegrate Pi Cos Pi 2 x y 1 y 1 y Sin 2 Pi x 1 y Sin Pi 2 x y 1 y E x 1 y x 0 1
  • 如何在“系统偏好设置 > 键盘 > 修饰键...”中更改修饰键

    我需要以编程方式更改 系统偏好设置 gt 键盘 gt 修饰键 中的 Caps Lock Control Option 和 Command 键的值 我不想使用 AppleScript 有人能指出我正确的方向吗 这是 applescript c
  • 为什么使用 --follow 和 --reverse 的 git log 仅返回最后一次提交?

    我想从头开始反向查看文件的所有提交 我跑了 git log reverse file 它按预期工作 但对于重命名的文件 它仅显示重命名的提交 因此我在其中添加了 follow git log reverse follow file 但它现在
  • AntiForgeryToken 在 ASP.Net MVC 4 RC 中已弃用

    我刚刚安装了 ASP Net MVC 4 RC 来替换 ASP Net MVC 4 beta 当尝试运行现有应用程序时 我收到一条错误消息 AntiForgeryToken已被弃用 这是我的代码 using Html BeginForm F
  • 在 JavaScript 中创建 1..20 整数数组的最简洁方法

    创建此数组的最简洁方法是什么 var x 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 例如 一个for loop var x for var i 1 i lt 20 i x push
  • PHP:对象上的递归 htmlspecialchars

    我想为来自不同来源的数据建立一个通用的清理程序 对于清理 我的意思是 在这个阶段 将 htmlspecialchars 应用于字符串 现在 来自这些源的数据可以是任何东西 从对象到数组再到字符串 都是嵌套的 而且很复杂 并且格式总是有点不同
  • java.lang.IllegalArgumentException:无效的 URL:未知协议:f

    我需要编写一个程序来在javafx场景中显示图片 我使用ImageView来显示它 但我遇到了一个问题 线程 main 中的异常 java lang IllegalArgumentException 无效的 URL 未知协议 f 引起原因
  • 如何禁用 onclick 事件

    如何禁用 onclick 事件 我试过了onclick this disabled true 但它不起作用 这是一个 HTML 表格 table tr td Available td td Available td tr tr td div
  • 动画 div 高度一个接一个 onload javascript

    我已经成功地开始了我的动画工作 现在我希望其余的动画在每个动画之后稍微延迟div高度动画及其引起的问题 我尝试过使用getElementsByClassName但这并没有奏效 我已经发布了到目前为止的进展here https codepen
  • 重写 bool 抽象方法时出错

    我不明白为什么我的派生类中会出现此错误来覆盖方法布尔值 public class HotRod Racer private bool blower true false public HotRod public HotRod string
  • Node.js 和 C/C++ 集成:如何正确实现回调?

    我正在尝试实现一个与 Node js 集成的 C 扩展 该扩展将在内部调用一些阻塞调用 因此它需要为 Node js 世界提供一个非阻塞接口 如指定https nodejs org api addons html https nodejs
  • 防止 GNU make 在环境变量中扩展美元符号

    有没有办法让 GNU Make 在环境变量中按字面意思解释美元符号 获取这个 makefile echoFOO echo FOO 像这样运行它 FOO a bc make echo ac ac 我希望它能从字面上回应 a bc 但我找不到一
  • 在客户端 API 中使用 JWT 令牌

    我在 NET5 中有一个 API 使用 JWTBearer 来保护 API 现在我想配置我的客户端应用程序以使用从 api gettoken 生成的令牌 它在 swagger 中工作得很好 但我不知道如何配置我的 MVC 和 API 消费