c# - 如何在 .Net 5 Web API 中添加有关授权失败的自定义错误消息?
问题描述
我有一个受 Azure AD 保护的 .Net 5 Web API。我想要完成的是在授权失败时提供自定义错误消息。例如,
- 如果用户忘记
Authorization
在请求中添加标头,我想告诉用户此标头是必需的。 - 如果令牌已过期,我想确切地告诉用户,而不是简单地返回
401
没有详细信息的状态代码。
简单地将[Authorize]
属性放在控制器和/或操作之前不起作用,因为它返回401
状态代码并且不包含有关此错误的任何详细信息。
我搜索了它,发现我必须编写一个自定义授权过滤器并使用它应该可以完成我正在寻找的东西。
使用它blog post
,我能够编写自定义授权过滤器,但是我仍然无法找出如何验证令牌并返回适当的错误消息。
这是我到目前为止编写的代码:
启动.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
AuthorizationPolicy policy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme).RequireAuthenticatedUser().Build();
_ = services.AddAuthorization(options =>
{
options.DefaultPolicy = policy;
});
_ = services.AddControllers(options =>
{
options.Filters.Add(new CustomTokenAuthorizationFilter(policy));
});
_ = services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "API", Version = "v1" });
});
_ = services
.AddMicrosoftIdentityWebApiAuthentication(Configuration, "ApiSettings");
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
_ = app.UseDeveloperExceptionPage();
_ = app.UseSwagger();
_ = app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "API v1"));
}
_ = app.UseConfigureRequestHeaders();
_ = app.UseHttpsRedirection();
_ = app.UseRouting();
//_ = app.UseAuthentication();
_ = app.UseAuthorization();
_ = app.UseEndpoints(endpoints =>
{
_ = endpoints.MapControllers();
});
}
}
CustomAuthorizationFilter.cs
public class CustomTokenAuthorizationFilter : AuthorizeFilter
{
public CustomTokenAuthorizationFilter(AuthorizationPolicy policy) : base(policy)
{
}
public override async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
// Allow Anonymous skips all authorization
if (context.Filters.Any(item => item is IAllowAnonymousFilter))
{
return;
}
var policyEvaluator = context.HttpContext.RequestServices.GetRequiredService<IPolicyEvaluator>();
var authenticateResult = await policyEvaluator.AuthenticateAsync(Policy, context.HttpContext);
var authorizeResult = await policyEvaluator.AuthorizeAsync(Policy, authenticateResult, context.HttpContext, context);
return;
}
}
使用此代码,当我的令牌authenticateResult.Succeeded
属性 isfalse
和authorizeResult.Challenged
property is出现问题时true
。
如何找出导致授权失败的原因?任何帮助将不胜感激。
我正在使用Microsoft.Identity.Web
微软建议的 NuGet 包。
解决方案
您可以在这里做什么并使用错误控制器并捕获您未经授权的异常,然后从该异常中输出消息。
推荐阅读
- c++ - 由于 Ubuntu 18.04 上的 libicu 链接错误,无法静态链接 boost-locale
- java - Spring Security:外部认证和内部认证
- properties - 当小部件属性变得不可见时,重置或清除所有选择的小部件属性
- azure - Azure - Cosmos DB 与 API 应用程序的集成
- python - D-Bus - 调用远程过程时遇到“ServiceUnknown”异常
- python - 如何在其他函数(其他摆线)的曲线上绘制摆线?
- mysql - Laravel MySQL 到 SQL Server
- machine-learning - Google Cloud Vision 仅检测一种语言
- html - 4块文字合二为一
- node.js - stripe.invoices.sendinvoice 不是一个函数 - Stripe Billing (NodeJS)