- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当 401 和 403 发生时,我想使用 JSON 响应模型进行响应。例如:
HTTP 401
{
"message": "Authentication failed. The request must include a valid and non-expired bearer token in the Authorization header."
}
我正在使用中间件(如 this answer 中的建议)来拦截 404,效果很好,但 401 或 403 的情况并非如此。这是中间件:
app.Use(async (context, next) =>
{
await next();
if (context.Response.StatusCode == 401)
{
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonConvert.SerializeObject(UnauthorizedModel.Create(), SerializerSettings), Encoding.UTF8);
}
});
当放置在 Startup.Configure(..)
中的 app.UseJwtBearerAuthentication(..)
下面时,它似乎被完全忽略并返回正常的 401。
当放置在 Startup.Configure(..)
中的 app.UseJwtBearerAuthentication(..)
上方时,会引发以下异常:
Connection id "0HKT7SUBPLHEM": An unhandled exception was thrown by the application. System.InvalidOperationException: Headers are read-only, response has already started. at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item(String key, StringValues value) at Microsoft.AspNetCore.Http.Internal.DefaultHttpResponse.set_ContentType(String value) at MyProject.Api.Startup.<b__12_0>d.MoveNext() in Startup.cs
最佳答案
Set 走在正确的轨道上,但实际上不需要创建自己的中间件,因为您可以利用事件模型来覆盖默认的质询逻辑。
下面是一个示例,它将返回一个 401 响应,其中包含纯文本形式的 OAuth2 错误代码/描述(您当然可以返回 JSON 或任何您想要的内容):
app.UseJwtBearerAuthentication(new JwtBearerOptions
{
Authority = "http://localhost:54540/",
Audience = "http://localhost:54540/",
RequireHttpsMetadata = false,
Events = new JwtBearerEvents
{
OnChallenge = async context =>
{
// Override the response status code.
context.Response.StatusCode = 401;
// Emit the WWW-Authenticate header.
context.Response.Headers.Append(
HeaderNames.WWWAuthenticate,
context.Options.Challenge);
if (!string.IsNullOrEmpty(context.Error))
{
await context.Response.WriteAsync(context.Error);
}
if (!string.IsNullOrEmpty(context.ErrorDescription))
{
await context.Response.WriteAsync(context.ErrorDescription);
}
context.HandleResponse();
}
}
});
或者,您也可以使用状态代码页中间件,但对于 403 响应,您不会得到任何有关导致它的授权策略的提示:
app.UseStatusCodePages(async context =>
{
if (context.HttpContext.Request.Path.StartsWithSegments("/api") &&
(context.HttpContext.Response.StatusCode == 401 ||
context.HttpContext.Response.StatusCode == 403))
{
await context.HttpContext.Response.WriteAsync("Unauthorized request");
}
});
关于asp.net-core - 使用 UseJwtBearerAuthentication 中间件自定义 401 和 403 响应模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38281116/
当您使用 VS 2017 创建新的 Web API 并选择使用“工作或学校帐户”进行身份验证时,您将获得使用 JwtBearerAuthentication 库的代码。也可以手动编写 Web API
我在我的应用程序堆栈中使用 Firebase 和 dotnet 核心。 我正在使用 Firebase iOS API 生成 JWT 罚款,并且可以使用 jwt.io 确认结构符合预期且有效。的解析器。
我正在尝试使用 JWT用于身份验证机制 ASP.NET Core Web API项目。假设这个项目没有 MVC部分并且不使用 cookie 身份验证。我已经基于 this guide 创建了我的代码.
有人可以解释一下 UseOAuthBearerAuthentication 和 UseJwtBearerAuthentication 之间有什么区别吗? 为什么我应该使用“UseOAuthBearer
使用单个 asp.net(4.6.1) web 项目,显然我无法验证在同一服务器上生成的 jwt token 。 Startup.cs: var secret = Encoding.U
将代码库从 ASP 5 beta 7 更新到 RC1-final 后,我开始从 JwtBearer 中间件收到此异常 Unable to cast object of type 'Newtonsoft
我正在像这样使用 UseJwtBearerAuthentication app.UseJwtBearerAuthentication(options => { options.Authority
使用 ASP.NET Core 1.0 (rtm),有点 minimal verifiable sample我已经生成,我看到我生成的 JSON Web token 没有通过 .net core js
我已经使用 dot net core 1.1 开发了一个 web 应用程序。在我更新到 asp 核心 2.0 之前,它一直工作正常。然后在尝试使用该应用程序时,它报告此错误: InvalidOpera
当 401 和 403 发生时,我想使用 JSON 响应模型进行响应。例如: HTTP 401 { "message": "Authentication failed. The request m
我见过表明 IApplicationBuilder 的示例有一个扩展方法.UseJwtBearerAuthentication(Action options) . 这个SO question和 Asp
我是一名优秀的程序员,十分优秀!