У меня есть приложение net core 2.0 и проблема с авторизацией. Я хочу использовать специальную авторизацию с помощью специальной request.header и стандартной аутентификации по умолчанию. Во-первых, я добавляю конфигурацию в startup.cs:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
...
services.AddAuthorization(options =>
{
options.AddPolicy(DefaultAuthorizedPolicy, policy =>
{
policy.Requirements.Add(new TokenAuthRequirement());
});
});
services.AddSingleton<IAuthorizationHandler, AuthTokenPolicy>();
...
}
и AuthTokenPolicy.cs
public class AuthTokenPolicy : AuthorizationHandler<TokenAuthRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TokenAuthRequirement requirement)
{
var filterContext = context.Resource as AuthorizationFilterContext;
var response = filterContext.HttpContext.Response;
try
{
// some validation code
var isValidToken = isValidTokenTask.Result;
if (!isValidToken)
{
response.StatusCode = 401;
return Task.CompletedTask;
}
response.StatusCode = 200;
context.Succeed(requirement);
}
catch (Exception)
{
return Task.CompletedTask;
}
return Task.CompletedTask;
}
}
и в HomeController.cs
[Authorize(Policy = Startup.DefaultAuthorizedPolicy)]
public async Task<IActionResult> IsVisible()
Если я использую неправильный request.header в AuthTokenPolicy, я вижу это. Но в журналах я вижу ошибку:
System.InvalidOperationException: не указана спецификация authenticationScheme, и не было обнаружено DefaultChallengeScheme.\r\n в Microsoft.AspNetCore.Authentication.AuthenticationService.d__11.MoveNext()\r\n --- Конец трассировки стека из предыдущего где исключение было выбрано ---\r\n в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Microsoft.AspNetCore.Mvc.ChallengeResult.d__14.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выбрано исключение -\r\n в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__19.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где исключение было выбрано ---\r\n в System.Runtime.ExceptionServices.ExceptionDispatc hInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выбрано исключение -\r\n в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача задачи)\r\n в Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выбрано исключение -\r\n в System.Runtime.ExceptionServices. ExceptionDispatchInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()\r\n --- Конец трассировка стека из предыдущего места, где было выбрано исключение -\r\n в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Thr ow()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.d__3.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где исключение было выбрано ---\r\n в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача задачи)\r\n при реактиве .AspNet.BabelFileMiddleware.d__5.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где было выбрано исключение -\r\n в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n в Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext()\r\n --- Конец трассировки стека из предыдущего места, где исключение было брошен ---\r\n в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(задача задачи)\r\n на core.common.Middleware.LoggingMiddleware.d__3.MoveNext() в D:\Dev\microservicePDP\Template\core.common\Middleware\LoggingMiddleware.cs: строка 72
После чтения Миграция аутентификации и идентификации в ASP.NET Core 2.0 Я добавил этот код в startup.cs
Цитата из статьи:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});
Определите схему по умолчанию в 2.0, если выполнено одно из следующих условий: Вы хотите, чтобы пользователь был автоматически подписан Вы используете атрибут [Авторизовать] или авторизацию без указания схем
В ConfigureServices я добавил AuthenticationScheme и DefaultChallengeScheme. Это не помогло, такая же ошибка здесь. Я попробовал использовать app.UseAuthentication(); в Configure в StartUp.cs нет результатов. Может ли кто-нибудь объяснить, как использовать настраиваемую авторизацию без аутентификации?