【问题标题】:which TokenValidationParameters are needed with UseJwtBearerAuthenticationUseJwtBearerAuthentication 需要哪些 TokenValidationParameters
【发布时间】:2017-06-28 01:50:48
【问题描述】:

我想在我的 .net WebAPI 上做 JwtBearerAuthentication,但它只是不工作。 Authorize 属性始终声称 isAuthorized = false。

我作为 SSO 与 Okta 合作。我在客户端进行身份验证并获取访问令牌和 ID 令牌。在 webapi 获取请求中,我在授权标头中提供了访问令牌(我也尝试了 id 令牌),并且我能够在 webapi actioncontext 中看到带有令牌的授权标头。

在我的 startup.cs 中,我有以下内容

var clientID = WebConfigurationManager.AppSettings["okta:ClientId"];

var oidcIssuer = WebConfigurationManager.AppSettings["okta:OIDC_Issuer"];

TokenValidationParameters tvps = new TokenValidationParameters
{
    ValidAudience = clientID,
    ValidateAudience = true,
    ValidIssuer = oidcIssuer,
    ValidateIssuer = true  
};

app.UseJwtBearerAuthentication(new JwtBearerAuthenticationOptions
{
    TokenValidationParameters = tvps,
    IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
    {
        new OpenIdConnectCachingSecurityTokenProvider(oidcIssuer + "/.well-known/openid-configuration")
    }
});

我是否缺少一些我需要的 TokenValidationParameters?

【问题讨论】:

    标签: asp.net-web-api token owin jwt okta


    【解决方案1】:

    当我输入这个时,我看到 twaldron 能够弄清楚!

    我也意识到他问的是 WebAPI,而不是 MVC。但是,这里是我需要让以下代码与 ASP.NET Core MVC 一起工作,特别感兴趣的可能是这一行,这是访问 JWT 中的其他声明所必需的:

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    

    以下是此代码示例在命令行中的工作方式,$ID_TOKEN 变量包含有效的 JWT:

    $ curl -H "Authorization: Bearer ${ID_TOKEN}" http://localhost:3000/test/test
    sub: 01a23b4cd5eFgHI6j7k8 email:test@example.com
    

    Setup.cs

    using System;
    using Microsoft.AspNetCore.Builder;
    using Microsoft.AspNetCore.Hosting;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.DependencyInjection;
    using Microsoft.Extensions.Logging;
    using Microsoft.IdentityModel.Tokens;
    using System.IdentityModel.Tokens.Jwt;
    
    namespace WebApplication
    {
        public class Startup
        {
            readonly string clientId = string.Empty;
            readonly string issuer = string.Empty;
            readonly string audience = string.Empty;
    
            public Startup(IHostingEnvironment env)
            {
                clientId = "A0b1CDef2GHIj3k4lm5n";
                issuer = "https://example.okta.com";
                audience = "A0b1CDef2GHIj3k4lm5n";
            }
    
            public IConfigurationRoot Configuration { get; }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
            }
    
            public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
            {
                loggerFactory.AddDebug();
    
                // https://github.com/aspnet/Security/issues/1043#issuecomment-261937401
                JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
    
                TokenValidationParameters tvps = new TokenValidationParameters
                {
    
                    ValidateAudience = true,
                    ValidAudience = audience,
    
                    ValidateIssuer = true,
                    ValidIssuer = issuer,
    
                    ValidateLifetime = true,
                    ClockSkew = TimeSpan.FromMinutes(5)
                };
    
                app.UseJwtBearerAuthentication(new JwtBearerOptions
                {
                    MetadataAddress = issuer + "/.well-known/openid-configuration",
                    TokenValidationParameters = tvps
                });
    
    
                app.UseStaticFiles();
    
                // Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "test-controller",
                        template: "test/{action}",
                        defaults: new { controller = "Test", action = "Index" }
                    );
                    routes.MapRoute(
                        name: "default",
                        template: "{controller=Test}/{action=Index}/{id?}");
                });
            }
        }
    }
    

    Controllers/Test.cs 中:

        [Authorize]
        public IActionResult Test()
        {
            var contextUser = User.Identity as ClaimsIdentity;
            Dictionary<string, string> claim = contextUser.Claims.ToDictionary(x => x.Type, x => x.Value);
    
            var output = "sub: " + claim["sub"] + " email:" + claim["email"];
            return Content(output);
        }
    

    【讨论】:

    • 感谢有关团体声明的提示。这实际上是我现在正在努力解决的问题。我没有得到它们。 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();实际上对我不起作用我没有那个确切的方法,我只能找到 InboundClaimTypeMap.Clear();
    • 我在 "Microsoft.NETCore.App": "1.1.0" 上使用 "Microsoft.AspNetCore.Mvc": "1.0.1" 得到了这段代码。我必须将这些添加到我的 project.json 文件中才能正常工作:Microsoft.AspNetCore.Authentication.OAuth、Microsoft.AspNetCore.Authentication.JwtBearer、Microsoft.AspNetCore.Identity - 我不记得是哪一个定义了 JwtSecurityTokenHandler。如果你发现了,请告诉我!
    【解决方案2】:

    我的问题不在于选项。 100% 需要搬家

    app.UseWebApi(config);
    

    在所有 owin 设置内容之下。

    【讨论】:

    • 很高兴你能解决这个问题!我在下面添加了一些代码,只是因为我无法访问索赔并认为这可能对您有帮助? (您应该将此标记为“已回答”吗?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-27
    • 2017-10-28
    • 2021-07-06
    • 2018-10-22
    • 2012-06-08
    • 2013-10-20
    • 2014-08-28
    相关资源
    最近更新 更多