如何证明 JWT 是不是有效并且是不是真的来自 Microsoft?

Posted

技术标签:

【中文标题】如何证明 JWT 是不是有效并且是不是真的来自 Microsoft?【英文标题】:How to prove if a JWT is valid and is really from Microsoft?如何证明 JWT 是否有效并且是否真的来自 Microsoft? 【发布时间】:2021-06-13 13:48:17 【问题描述】:

客户端应用程序正在从 Microsoft 获取 JWT,并将其发送到我的 API。它工作正常,但我的 API 如何知道令牌是否真的来自 Microsaft 以及它是否有效?

这是客户端获取令牌的方式:

string ClientID = "xxx";
string TenantID = "yyy";

IPublicClientApplication pca = PublicClientApplicationBuilder
     .Create(ClientID)
     .WithAuthority(AzureCloudInstance.AzurePublic, TenantID)
     .WithRedirectUri("https://login.microsoftonline.com/common/oauth2/nativeclient")
     .Build();

string[] scopes =  "user.read" ;
AuthenticationResult result = await pca.AcquireTokenInteractive(scopes).ExecuteAsync();
string JWT = result.AccessToken;
客户端使用 .net framework 4.8 编写 API 使用 .net core 3.1 编写

【问题讨论】:

【参考方案1】:

在API项目中,可以安装Microsoft.Identity.Web包。 然后在 Startup.cs 中添加如下代码

    services
       .AddAuthentication()
       .AddMicrosoftIdentityWebApi(options =>  , options =>
        
            options.ClientId = "Your Azure AD ClientId";
            options.TenantId = "Your Azure AD TenantId";
            options.Instance = "https://login.microsoftonline.com/";
        );

要手动完成,请尝试类似

services.AddAuthentication(options =>
            
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            ).AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
             
                 var clientSecret = "";
                 var clientId = "";
                 var tenantId = "";

                 options.TokenValidationParameters = new TokenValidationParameters
                 
                     ValidAudience = clientId,
                     ValidIssuer = $"https://sts.windows.net/tenantId/",
                     IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(clientSecret)),
                     ValidateIssuer = true,
                     ValidateIssuerSigningKey = true,
                     ValidateLifetime = true,
                     ValidateAudience = true,
                     ClockSkew = TimeSpan.Zero
                 ;
            );

【讨论】:

谢谢!但是,我想在每个发布命令中“手动”检查令牌。你知道这是怎么做到的吗?

以上是关于如何证明 JWT 是不是有效并且是不是真的来自 Microsoft?的主要内容,如果未能解决你的问题,请参考以下文章

真的有必要在 JWT 中内置有效负载吗?

这个 JWT 实现是不是可以防止 XSS 和 CSRF 攻击,同时仍然允许我访问有效负载?

我如何知道 json Web 令牌是不是被篡改

实现 JWT 的最佳方式?

如何检查 JWT 令牌是不是在 Angular 8 中过期

客户是不是应该创建自己的 JWT