2016-02-07 11 views
6

मैं decoupled संसाधन और प्रमाणीकरण सर्वर का उपयोग कर रहा हूँ। जब मैं सफलतापूर्वक जेएसओएन वेब टोकन प्राप्त करता हूं, तो मैं इसे jwt.io से जांचता हूं और टोकन प्रारूप के साथ सब ठीक है और यह रहस्य है।एएसपी.नेट जेएसओएन वेब टोकन "401 अनधिकृत"

अनुरोध प्राधिकरण हेडर के साथ है:

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 
} 

मैंने गुप्त जांच की है और यह दोनों तरफ (औथ और संसाधन सर्वर) पर समान है। ऑडियंस मैचों, जारीकर्ता भी। पहले से ही 3.0.2 संस्करण के लिए System.IdentityModel.Tokens.Jwt को डाउनग्रेड करने का प्रयास किया गया है लेकिन कोई भाग्य

मुझे लगता है कि कॉन्फ़िगरेशन ऑर्डर में कुछ समस्या है, लेकिन कुछ भी मदद नहीं की।

कोई विचार?

उत्तर

5

टीएल; डीआर: क्या आपने GlobalConfiguration.Configuration.SuppressDefaultHostAuthentication() को हटाने का प्रयास किया है?

इस विधि का उपयोग करते समय, वेब एपीआई उपयोगकर्ता द्वारा बनाए गए उपयोगकर्ता प्रिंसिपल को हटा देता है और वेब एपीआई (आपके मामले में, जेडब्ल्यूटी बीयरर मिडलवेयर द्वारा) से पहले होस्ट किए गए मिडलवेयर द्वारा ओविन संदर्भ में जोड़ा जाता है।

इस विधि का उपयोग HostAuthenticationFilter या HostAuthenticationAttribute के साथ किया जाना है, जो निर्दिष्ट प्रमाणीकरण प्रकार से संबंधित प्रमाणीकरण मिडलवेयर को सीधे आमंत्रित करता है और परिणामस्वरूप उपयोगकर्ता प्रिंसिपल को ओविन संदर्भ में जारी रखता है।

जब से तुम HostAuthenticationAttribute बिना SuppressDefaultHostAuthentication उपयोग कर रहे हैं, जाल एपीआई हमेशा अप्रमाणित अनुरोधों को देखती है, और यही कारण है कि वे AuthorizeAttribute द्वारा अस्वीकार कर दिया जाता है।

+1

इससे मदद मिली, बहुत बहुत धन्यवाद! मैंने सोचा कि SuppressDefaultHostAuthentication() एक और प्रमाणीकरण हैंडलर पहले होने की अनुमति देता है। सहमत हैं, उपयुक्त HostAuthenticationFilter अनुपलब्ध था – Begunini

संबंधित मुद्दे