2017-02-09 47 views
1

我正打算在我的.net WebAPI上做JwtBearerAuthentication,它只是不起作用。 Authorize屬性始終聲明isAuthorized = false。需要使用哪個TokenValidationParameters和UseJwtBearerAuthentication

我正在與Okta一起作爲SSO。我在客戶端進行身份驗證並獲取訪問令牌和身份標識令牌。在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我需要什麼?

回答

1

我的問題不是與選項。 這是100%,需要下面的所有owin設置的東西移動

app.UseWebApi(config); 

+1

很高興你能想出解決辦法!我在下面添加了一些代碼,僅僅是因爲我有問題可以獲得索賠,並認爲這可能對您有所幫助? (您應該將此標記爲「已回答」?) –

0

當我輸入這個時,我看到那個twaldron能想出來!

我也意識到他問的是WebAPI,而不是MVC。然而,這裏是我需要得到下面用ASP.NET MVC的核心工作代碼,特別感興趣的可能是這條線,這是必要的,以獲得在JWT的額外索賠訪問:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

下面是該代碼示例在命令行中是如何工作的,在$ID_TOKEN變量包含一個有效的智威湯遜:

$ curl -H "Authorization: Bearer ${ID_TOKEN}" http://localhost:3000/test/test 
sub: 01a23b4cd5eFgHI6j7k8 email:[email protected] 

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?}"); 
      }); 
     } 
    } 
} 

控制器/ 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); 
    } 
+0

感謝您提供關於羣組聲明的提示。這實際上是我現在正在努力的。我沒有得到他們。 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();沒有爲我工作actualIy我沒有那個確切的方法,我只能找到InboundClaimTypeMap.Clear(); – twaldron

+1

我在「Microsoft.NETCore.App」上使用「Microsoft.AspNetCore.Mvc」:「1.0.1」代碼工作:「1.1.0」。我不得不將這些添加到我的project.json文件中以使其工作:Microsoft.AspNetCore.Authentication.OAuth,Microsoft.AspNetCore.Authentication.JwtBearer,Microsoft.AspNetCore.Identity - 我不記得哪一個定義了JwtSecurityTokenHandler。讓我知道你是否知道! –