gpt4 book ai didi

ASP.NET JSON Web token "401 Unauthorized"

转载 作者:行者123 更新时间:2023-12-02 17:06:20 25 4
gpt4 key购买 nike

我正在使用分离的资源和身份验证服务器。当我成功获取 JSON Web token 时,我使用 jwt.io 检查它, token 格式一切正常,并且它是 secret 的。

请求带有授权 header :

Authorization: Bearer TOKEN_HERE

响应始终为“401 Unauthorized”:

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

}
}
}

以下是 token 解密的示例:

{
"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
}

我已经检查了 secret ,双方(身份验证和资源服务器)都是相同的。观众相配,发行者也。已尝试将 System.IdentityModel.Tokens.Jwt 降级到版本 3.0.2,但没有成功

我猜配置顺序有问题,但没有任何帮助。

有什么想法吗?

最佳答案

TL;DR:您是否尝试过删除 GlobalConfiguration.Configuration.SuppressDefaultHostAuthentication()

使用此方法时,Web API 会删除由主机或在 Web API 之前注册的中间件(在您的情况下,由 JWT 承载中间件)创建并添加到 OWIN 上下文的用户主体。

此方法旨在与 HostAuthenticationFilterHostAuthenticationAttribute 一起使用,直接调用与指定身份验证类型相对应的身份验证中间件,并将生成的用户主体保留在 OWIN 中上下文。

由于您使用 SuppressDefaultHostAuthentication 而不使用 HostAuthenticationAttribute,Web API 始终会看到未经身份验证的请求,这就是它们被 AuthorizeAttribute 拒绝的原因。

关于ASP.NET JSON Web token "401 Unauthorized",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com