J'ai une application .NET Core 2.0 et j'ai un problème d'authentification. Je veux utiliser une autorisation personnalisée avec des requêtes spéciales. En-tête et authentification standard par défaut. Tout d'abord, j'ajoute la configuration dans Startup.cs
:
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthorization(options =>
{
options.AddPolicy(DefaultAuthorizedPolicy, policy =>
{
policy.Requirements.Add(new TokenAuthRequirement());
});
});
services.AddSingleton();
// ...
}
AuthTokenPolicy.cs
:
public class AuthTokenPolicy : AuthorizationHandler
{
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;
}
}
et dans HomeController.cs
:
[Authorize(Policy = Startup.DefaultAuthorizedPolicy)]
public async Task IsVisible()
Si j'utilise le mauvais request.header dans AuthTokenPolicy
je le vois, mais dans les journaux je vois cette erreur :
System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found.\r\n at Microsoft.AspNetCore.Authentication.AuthenticationService.d__11.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.AspNetCore.Mvc.ChallengeResult.d__14.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__19.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.d__3.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at React.AspNet.BabelFileMiddleware.d__5.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext()\r\n--- Fin de la trace de la pile à l'emplacement précédent où l'exception a été levée ---\r\n at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at core.common.Middleware.LoggingMiddleware.d__3.MoveNext() in D:\Dev\microservicePDP\Template\core.common\Middleware\LoggingMiddleware.cs:line 72
Après avoir lu Migration de l'authentification et de l'identité vers ASP.NET Core 2.0 j'ai ajouté ce code dans startup.cs
Citation de l'article :
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});
Définissez un schéma par défaut en 2.0 si l'une des conditions suivantes est vraie : Vous voulez que l'utilisateur soit automatiquement connecté Vous utilisez l'attribut [Authorize] ou des stratégies d'autorisation sans spécifier de schémas
J'ai ajouté AuthenticationScheme
et DefaultChallengeScheme
dans ConfigureServices()
. Cela n'a pas aidé, la même erreur ici. J'ai essayé d'utiliser app.UseAuthentication();
dans la méthode Startup.Configure()
, sans résultat.
Comment puis-je utiliser une autorisation personnalisée sans authentification ?
1 votes
Donc après avoir utilisé
AddAuthentication
, avez-vous à nouveau utilisé[Authorize(Policy = Startup.DefaultAuthorizedPolicy)]
?0 votes
Oui. N'est-ce pas juste?
0 votes
Je confirmais simplement ce que vous aviez écrit. Je suppose que
DefaultChallengeScheme
est défini uniquement pour la stratégie d'autorisation par défaut... dans tous les cas, essayez ma réponse