2016-02-07 22 views
6

私は、分離されたリソースと認証サーバーを使用しています。 JSON Webトークンを正常に取得すると、jwt.ioでチェックし、すべてがトークン形式で問題なく、秘密です。ASP.NET JSON Webトークン「401 Unauthorized」

リクエストは、認証ヘッダーである:

Authorization: Bearer TOKEN_HERE 

応答は常に "401無許可" である:ここでは

{ 
    "message": "Authorization has been denied for this request." 
} 

リソースサーバからの私Startup.csここ

using Microsoft.Owin; 
using Microsoft.Owin.Cors; 
using Microsoft.Owin.Security; 
using Microsoft.Owin.Security.Jwt; 
using Newtonsoft.Json.Serialization; 
using Owin; 
using System.Web.Http; 
using Test.Database; 
using Test.Infrastructure; 
using Microsoft.WindowsAzure.ServiceRuntime; 

[assembly: OwinStartup(typeof(Test.API.Startup))] 
namespace Custodesk.API 
{ 
    public class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      app.CreatePerOwinContext(() => 
       ApplicationDbContext.Create(RoleEnvironment.GetConfigurationSettingValue("SqlConnectionString"))); 
      app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

      GlobalConfiguration.Configuration.SuppressDefaultHostAuthentication(); 

      ConfigureOAuthTokenConsumption(app); 

      GlobalConfiguration.Configure(config => 
      { 
       //global filters 
       config.Filters.Add(new AuthorizeAttribute()); 

       // Web API routes 
       config.MapHttpAttributeRoutes(); 
       config.Routes.MapHttpRoute(
        name: "DefaultApi", 
        routeTemplate: "{controller}/{action}/{id}", 
        defaults: new { id = RouteParameter.Optional } 
       ); 

       config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
      }); 

      app.UseCors(CorsOptions.AllowAll); 

      app.UseWebApi(GlobalConfiguration.Configuration); 
     } 

     private void ConfigureOAuthTokenConsumption(IAppBuilder app) 
     { 
      var issuer = "http://localhost"; 
      var audience = "Universal_application"; 
      var secret = Helper.GetHash("helper_class_to_get_the_same_hash_as_authentication_server"); 

      // Api controllers with an [Authorize] attribute will be validated with JWT 
      app.UseJwtBearerAuthentication(
       new JwtBearerAuthenticationOptions 
       { 
        AuthenticationMode = AuthenticationMode.Active, 
        AllowedAudiences = new[] { audience }, 
        IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
        { 
         new SymmetricKeyIssuerSecurityTokenProvider(issuer, secret) 
        } 
       }); 

     } 
    } 
} 

はです解読されたトークンの例:

{ 
    "typ": "JWT", 
    "alg": "HS256" 
} 
{ 
    "nameid": "b22a825e-60ce-45ed-b2cb-b2ee46a47936", 
    "unique_name": "begunini", 
    "role": [ 
    "Owner", 
    "Admin", 
    "ManagerViewer" 
    ], 
    "iss": "http://localhost", 
    "aud": "Universal_application", 
    "exp": 1454876502, 
    "nbf": 1454876202 
} 

私はシークレットをチェックしましたが、それは両側で同じです(認証サーバーとリソースサーバー)。 オーディエンスが一致し、発行者でもあります。 既にSystem.IdentityModel.Tokens.Jwtをバージョン3.0.2にダウングレードしようとしましたが、運はありません

設定の順序に問題はありますが、何も助けにはなりません。

アイデア?

答えて

5

TL; DR:削除しましたGlobalConfiguration.Configuration.SuppressDefaultHostAuthentication()

Web APIは、ホストまたはWeb APIの前に登録されているミドルウェア(JWTベアラミドルウェアの場合)によって作成され、OWINコンテキストに追加されたユーザープリンシパルを削除します。

このメソッドは、HostAuthenticationFilterまたはHostAuthenticationAttributeで使用するためのもので、指定された認証タイプに対応する認証ミドルウェアを直接呼び出し、結果のユーザープリンシパルをOWINコンテキストに保持します。

HostAuthenticationAttributeなしでSuppressDefaultHostAuthenticationを使用しているため、Web APIには認証されていない要求が常に表示されるため、AuthorizeAttributeによって拒否されます。

+1

これは、多くのおかげで助けて!私は、SuppressDefaultHostAuthentication()が別の認証ハンドラを優先させると考えました。同意する、適切なHostAuthenticationFilterが不足していた – Begunini

関連する問題