私は、分離されたリソースと認証サーバーを使用しています。 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にダウングレードしようとしましたが、運はありません
設定の順序に問題はありますが、何も助けにはなりません。
アイデア?
これは、多くのおかげで助けて!私は、SuppressDefaultHostAuthentication()が別の認証ハンドラを優先させると考えました。同意する、適切なHostAuthenticationFilterが不足していた – Begunini