wake-up-neo.com

Es wurde kein authenticationScheme angegeben, und es wurde kein DefaultChallengeScheme mit Standardauthentifizierung und benutzerdefinierter Autorisierung gefunden

Ich habe eine Net Core 2.0 App und ein Problem mit der Autorisierung. Ich möchte eine benutzerdefinierte Autorisierung mit der speziellen Standardauthentifizierung request.header und Standart verwenden. __ Zuerst füge ich die Konfiguration in startup.cs hinzu:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  ...
services.AddAuthorization(options =>
            {
                options.AddPolicy(DefaultAuthorizedPolicy, policy =>
                {
                    policy.Requirements.Add(new TokenAuthRequirement());
                });
            });
services.AddSingleton<IAuthorizationHandler, AuthTokenPolicy>();
  ...
}

und 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;
    }
}

und in HomeController.cs

[Authorize(Policy = Startup.DefaultAuthorizedPolicy)]
    public async Task<IActionResult> IsVisible()

Wenn ich in AuthTokenPolicy falsches request.header verwende, sehe ich es. Aber in Protokollen sehe ich Fehler:

System.InvalidOperationException: Es wurde kein authenticationScheme angegeben, und es wurde kein DefaultChallengeScheme gefunden.\R\n unter Microsoft.AspNetCore.Authentication.AuthenticationService.d__11.MoveNext ()\r\n --- Ende der Stack-Ablaufverfolgung vom vorherigen Speicherort mit Ausnahme wurde bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()\r\n bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task Task)\r\n bei Microsoft.AspNetCore.Mvc geworfen. ChallengeResult.d__14.MoveNext ()\r\n --- Ende der Stack-Ablaufverfolgung von der vorherigen Position, an der die Ausnahme ausgelöst wurde ---\r\n unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()\r\n unter System .Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task)\r\n bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__19.MoveNext ()\r\n --- Ende des Stack-Trace an einem früheren Ort, an dem die Ausnahme ausgelöst wurde ---\r\n bei System.Runtime.ExceptionServices.ExceptionDispatchIn fo.Throw ()\r\n bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task)\r\n bei Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext ()\r\n --- Ende des Stack-Trace von vorherigem Speicherort, an dem eine Ausnahme ausgelöst wurde ---\r\n unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()\r\n unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task Task)\r\n at Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext ()\r\n --- Ende der Stack-Ablaufverfolgung vom vorherigen Speicherort, an dem eine Ausnahme ausgelöst wurde ---\r\n bei System.Runtime.ExceptionServices. ExceptionDispatchInfo.Throw ()\r\n bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task Task)\r\n bei Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext ()\r\n Ende Stack-Trace vom vorherigen Speicherort, an dem eine Ausnahme ausgelöst wurde ---\r\n unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ( )\r\n bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task)\r\n bei Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.d__3.MoveNext ()\r\n --- Ende der Stapelverfolgung von oben Speicherort, an dem die Ausnahme ausgelöst wurde ---\r\n unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()\r\n unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task)\r\n bei React.AspNet .BabelFileMiddleware.d__5.MoveNext ()\r\n --- Ende der Stack-Ablaufverfolgung von der vorherigen Position, an der die Ausnahme ausgelöst wurde ---\r\n unter System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()\r\n um System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task)\r\n bei Microsoft.AspNetCore.AuthenticationMiddleware.d__6.MoveNext ()\r\n --- Ende des Stack-Trace an einem früheren Ort ausgelöst - -\r\n bei System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw ()\r\n unter System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task)\r\n unter core.common.Middleware.LoggingMiddleware.d__3.MoveNext () in D:\Dev\microservicePDP\Template\core.common\Middleware\Log .cs: ​​Zeile 72

Nach dem Lesen von Migrating Authentication und Identity zu ASP.NET Core 2.0 habe ich diesen Code in startup.cs hinzugefügt

Zitat aus dem Artikel: 

services.AddAuthentication(options => 
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});

Definieren Sie ein Standardschema in 2.0, wenn eine der folgenden Bedingungen erfüllt ist: Sie möchten, dass der Benutzer automatisch angemeldet wird Sie verwenden das Attribut [Authorize] oder die Autorisierungsrichtlinien, ohne Schemas anzugeben

Ich habe AuthenticationScheme und DefaultChallengeScheme in ConfigureServices hinzugefügt. Es war keine Hilfe, der gleiche Fehler hier. Ich habe versucht verwendet app.UseAuthentication (); in Configure in StartUp.cs, keine Ergebnisse ... Kann jemand erklären, wie die benutzerdefinierte Autorisierung ohne Authentifizierung verwendet wird?

17
Galina

Okey. Die richtige Antwort lautet: Verwenden Sie keine Autorisierung statt Authentifizierung. Ich sollte vollen Zugriff auf alle Clients mit Header erhalten. .__ Der Arbeitscode ist:

public class TokenAuthenticationHandler : AuthenticationHandler<TokenAuthenticationOptions> 
{
    public IServiceProvider ServiceProvider { get; set; }

    public TokenAuthenticationHandler (IOptionsMonitor<TokenAuthenticationOptions> options, ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock, IServiceProvider serviceProvider) 
        : base (options, logger, encoder, clock) 
    {
        ServiceProvider = serviceProvider;
    }

    protected override Task<AuthenticateResult> HandleAuthenticateAsync () 
    {
        var headers = Request.Headers;
        var token = "X-Auth-Token".GetHeaderOrCookieValue (Request);

        if (string.IsNullOrEmpty (token)) {
            return Task.FromResult (AuthenticateResult.Fail ("Token is null"));
        }           

        bool isValidToken = false; // check token here

        if (!isValidToken) {
            return Task.FromResult (AuthenticateResult.Fail ($"Balancer not authorize token : for token={token}"));
        }

        var claims = new [] { new Claim ("token", token) };
        var identity = new ClaimsIdentity (claims, nameof (TokenAuthenticationHandler));
        var ticket = new AuthenticationTicket (new ClaimsPrincipal (identity), this.Scheme.Name);
        return Task.FromResult (AuthenticateResult.Success (ticket));
    }
}

Startup.cs:

#region Authentication
services.AddAuthentication (o => {
    o.DefaultScheme = SchemesNamesConst.TokenAuthenticationDefaultScheme;
})
.AddScheme<TokenAuthenticationOptions, TokenAuthenticationHandler> (SchemesNamesConst.TokenAuthenticationDefaultScheme, o => { });
#endregion

Und mycontroller.cs

[Authorize(AuthenticationSchemes = SchemesNamesConst.TokenAuthenticationDefaultScheme)]
public class MainController : BaseController
{ ...}

Ich kann TokenAuthenticationOptions jetzt nicht finden, aber es war leer. Ich habe die gleiche Klasse PhoneNumberAuthenticationOptions gefunden:

namespace Project.Auth{
public class PhoneNumberAuthenticationOptions : AuthenticationSchemeOptions
{
    public Regex PhoneMask { get; set; }// = new Regex("7\\d{10}");

}}

Sie sollten die statische Klasse SchemesNamesConst .__ definieren. Etwas wie: 

namespace Common.Const{
public static class SchemesNamesConst
{
    public const string SchemesNamesConst= "TokenAuthenticationScheme";
}}
11
Galina

Wenn ich die Richtlinie verwendet habe, bevor ich auch das Standardauthentifizierungsschema festlegte. Ich hatte DefaultPolicy geändert, sodass es etwas anders war. Dasselbe sollte jedoch auch für das Hinzufügen von Richtlinien funktionieren. 

services.AddAuthorization(options =>
        {
            options.AddPolicy(DefaultAuthorizedPolicy, policy =>
            {
                policy.Requirements.Add(new TokenAuthRequirement());
                policy.AuthenticationSchemes = new List<string>()
                                {
                                    CookieAuthenticationDefaults.AuthenticationScheme
                                }
            });
        });

Beachten Sie, dass die AuthenticationSchemes-Eigenschaft standardmäßig eine schreibgeschützte Liste verwendet. Ich denke, es wäre besser, dies anstelle von List zu implementieren. 

3

das hat für mich funktioniert 

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme,
        options =>
        {
            options.LoginPath = new PathString("/auth/login");
            options.AccessDeniedPath = new PathString("/auth/denied");
        });
2
ali zarei

Wenn Sie dies in Visual Studio mit einem Asp.Net-Kernprojekt durchführen, und plötzlich beginnt Ihre Anwendung nicht mit der Art der Fehlermeldung, die unten angegeben wurde. In diesem Fall funktionierte die Deaktivierung von "Browser-Link aktivieren"

Deaktivieren Sie diese Option

error : 

Conversion> [13:31:10 ERR] Connection id "0HLJ153E20LDJ", Request id "0HLJ153E20LDJ:00000003": An unhandled exception was thrown by the application.
Conversion> System.ObjectDisposedException: The response has been aborted due to an unhandled application exception. ---> System.FormatException: Invalid ETag name
Conversion>    at Microsoft.Net.Http.Headers.EntityTagHeaderValue..ctor(StringSegment tag, Boolean isWeak)
Conversion>    at Microsoft.Net.Http.Headers.EntityTagHeaderValue..ctor(StringSegment tag)
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleWareUtil.AddToETag(ResponseHeaders responseHeader, Int32 port)
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware.<>c__DisplayClass7_0.<ExecuteWithFilter>b__0()
Conversion>    at Microsoft.AspNetCore.Http.HttpResponse.<>c.<.cctor>b__30_0(Object callback)
Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.FireOnStartingMayAwait(Stack`1 onStarting)
Conversion>    --- End of inner exception stack trace ---
Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ThrowResponseAbortedException()
Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.InitializeResponseAsync(Int32 firstWriteByteCount)
Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.WriteAsync(ReadOnlyMemory`1 data, CancellationToken cancellationToken)
Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpResponseStream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count, CancellationToken cancellationToken)
Conversion>    at System.IO.Stream.WriteAsync(Byte[] buffer, Int32 offset, Int32 count)
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.ScriptInjectionFilterStream.<>c__DisplayClass37_0.<<CreateResponseHandler>b__0>d.MoveNext()
Conversion> --- End of stack trace from previous location where exception was thrown ---
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.SocketReader.ReadBytesIntoResponseHandler(Int64 totalBytesToRead, ResponseHandler handler, CancellationToken cancellationToken)
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.HttpSocketAdapter.ResponseReader.ReadBytesIntoResponse(Int64 bytesToRead)
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.HttpSocketAdapter.ResponseReader.ReadChunkedContent()
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.HttpSocketAdapter.ResponseReader.ReadResponse()
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.DelayConnectingHttpSocketAdapter.Microsoft.VisualStudio.Web.BrowserLink.IHttpSocketAdapter.WaitForResponseComplete()
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.ScriptInjectionFilterStream.WaitForFilterComplete()
Conversion>    at Microsoft.VisualStudio.Web.BrowserLink.BrowserLinkMiddleware.ExecuteWithFilter(IHttpSocketAdapter injectScriptSocket, String requestId, HttpContext httpContext)
Conversion>    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Conversion>    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
Conversion>    at Microsoft.AspNetCore.Server.IISIntegration.IISMiddleware.Invoke(HttpContext httpContext)
Conversion>    at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication`1 application)
0

Ihre erste Aussage in der markierten Lösung stimmt nicht ganz. Während Ihre neue Lösung Ihr ursprüngliches Ziel erreichen kann, ist es immer noch möglich, den ursprünglichen Fehler zu umgehen, während Sie Ihre AuthorizationHandler-Logik beibehalten. - bereitgestellt Sie verfügen über grundlegende Authentifizierungsschema-Handler, auch wenn sie funktionale Skelette sind.

Allgemein gesagt, Authentifizierungshandler und -schemata sind dazu gedacht, die Identität zu bestätigen und zu validieren, wodurch sie für das Funktionieren von Autorisierungshandlern richtlinien erforderlich sind, da sie unter der Annahme laufen, dass bereits eine Identität festgelegt wurde.

ASP.NET Dev Haok fasst das hier am besten zusammen: "Die heutige Authentifizierung kennt überhaupt keine Autorisierung, sondern kümmert sich lediglich um die Erstellung eines ClaimsPrincipal pro Schema. Die Autorisierung muss etwas über die Authentifizierung wissen, daher ist AuthenticationSchemes in der Richtlinie ein Mechanismus Damit können Sie die Richtlinie Schemata zuordnen, die zum Erstellen des effektiven Anspruchsberechtigungsprinzips für die Autorisierung verwendet werden (oder sie verwendet einfach den Standard-httpContext.User für die Anforderung, der auf DefaultAuthenticateScheme angewiesen ist). "/- https: // github. de/aspnet/Sicherheit/Probleme/1469

In meinem Fall lieferte die Lösung, an der ich arbeite, ein eigenes implizites Identitätskonzept, sodass wir keine Authentifizierungsschemata/-Handler benötigten - lediglich Header-Token für die Autorisierung. Bis sich unsere Identitätskonzepte ändern, können unsere Header-Token-Autorisierungshandler, die die Richtlinien erzwingen, an 1-zu-1-Schema-Skelette gebunden werden.

Tags auf Endpunkten:

[Authorize(AuthenticationSchemes = "AuthenticatedUserSchemeName", Policy = "AuthorizedUserPolicyName")]

Startup.cs:

        services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = "AuthenticatedUserSchemeName";
        }).AddScheme<ValidTokenAuthenticationSchemeOptions, ValidTokenAuthenticationHandler>("AuthenticatedUserSchemeName", _ => { });

        services.AddAuthorization(options =>
        {
            options.AddPolicy("AuthorizedUserPolicyName", policy =>
            {
                //policy.RequireClaim(ClaimTypes.Sid,"authToken");
                policy.AddAuthenticationSchemes("AuthenticatedUserSchemeName");
                policy.AddRequirements(new ValidTokenAuthorizationRequirement());
            });
            services.AddSingleton<IAuthorizationHandler, ValidTokenAuthorizationHandler>();

Beide werden mit dem leeren Authentifizierungshandler und Authorization Handler aufgerufen (ähnlich wie beim Setup des jeweiligen OPs), der Autorisierungshandler erzwingt jedoch weiterhin unsere Autorisierungsrichtlinien.

0
Dagan Danevic