Расширение политики авторизации [Authorize]
Это можно сделать с помощью политик авторизации. Настройте их в вашем Startup.cs
внутри ConfigureServices(IServiceCollection services)
следующим образом:
services.AddAuthorization(options =>
{
// Create your own policy and make the "access checks" in there
options.AddPolicy("MyAccessPolicy", policy => policy.RequireAssertion(httpCtx =>
{
if (access checks...)
return true;
else
return false;
}));
});
Затем вы просто декорируете действие вашего контроллера с атрибутом Authorize
следующим образом:
[Authorize(Policy = "MyAccessPolicy")]
public IActionResult Access()
{
return View();
}
Теперь, всякий раз, когда вы пытаетесь выполнить go - /access
, эта политика будет выполняться, и если политика вернет false, пользователь встретится с кодом состояния HTTP 403. (Запрещено).
Пользовательское промежуточное ПО, сопоставленное с маршрутом
В ответ на ваш комментарий приведен пример промежуточного программного обеспечения и его сопоставление с указанным c маршрутом.
Пример из моего собственного проекта с глобальным промежуточным программным обеспечением для обработки ошибок (некоторые не имеют отношения к делу). детали удалены):
public class ExceptionHandlingMiddleware : IMiddleware
{
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
try
{
// Call next middleware
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private async Task HandleExceptionAsync(HttpContext context, Exception ex)
{
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
ErrorDetails error = null;
if (ex is FileNotFoundException || ex is DirectoryNotFoundException)
{
context.Response.StatusCode = StatusCodes.Status404NotFound;
error = _localizer.FilesOrFoldersNotFound();
}
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonConvert.SerializeObject(
new CustomResponse(false, error ?? _localizer.DefaultError()),
_serializerSettings));
}
}
Чтобы использовать это промежуточное ПО только для определенных c маршрутов, которые вы могли бы сделать , как предлагается здесь :
// Startup.cs
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.Map("path/where/error/could/happen",
b => b.UseMiddleware<ExceptionHandlingMiddleware>());
// ...
}
Или проверьте Путь внутри самого промежуточного программного обеспечения:
// ExceptionHandlingMiddleware.cs
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
if (!context.Request.Path.StartsWithSegments("path/where/error/could/happen"))
{
// Skip doing anything in this middleware and continue as usual
await next(context);
return;
}
// Use middleware logic
try
{
// Call next middleware
await next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}