मैं 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 को डाउनग्रेड करने का प्रयास किया गया है लेकिन कोई भाग्य
मुझे लगता है कि कॉन्फ़िगरेशन ऑर्डर में कुछ समस्या है, लेकिन कुछ भी मदद नहीं की।
कोई विचार?
इससे मदद मिली, बहुत बहुत धन्यवाद! मैंने सोचा कि SuppressDefaultHostAuthentication() एक और प्रमाणीकरण हैंडलर पहले होने की अनुमति देता है। सहमत हैं, उपयुक्त HostAuthenticationFilter अनुपलब्ध था – Begunini