0

Ich versuche Authentifizierung mit Identity in meinem ASP.NET Core 2.0-Projekt zu implementieren, und es scheint nicht zu funktionieren. Das letzte Projekt, in das ich Identity implementiere, war ein ASP.NET MVC 5 Projekt, und die Dinge haben sich wesentlich verändert. Ich habe Core 1.0 und 1.1 übersprungen, also habe ich keine Ahnung, wie es unter diesen gemacht wurde, obwohl ich davon ausging, dass es größtenteils ähnlich ist.ASP.NET Core 2.0-Authentifizierung funktioniert nicht

Ich kann es aber nicht für mich arbeiten. Wenn ich sage, dass es nicht funktioniert, meine ich, dass ich nicht auf eine Login-Seite weitergeleitet werde, obwohl ich nicht autorisiert bin.

Die einzige Anpassung, die ich gemacht habe, ist, meinen eigenen Benutzerspeicher und meine eigene Erweiterung zu implementieren, um Identität ohne die Notwendigkeit einer Rolle hinzuzufügen, da ich keine Rollen verwenden werde. Ich könnte ein paar Anweisungen dazu verwenden, was ich vermasselt habe, weil alles aus meiner Sicht viel zu kompliziert ist. Hier ist der Code, den ich habe bisher:

Startup.cs

public void ConfigureServices(
    IServiceCollection services) { 
    services.AddDbContext<CustomDbContext>(); 
    services.AddTransient<IUserStore<GlobalUser>, CustomUserStore<GlobalUser>>(); 
    services.AddIdentity<GlobalUser>(); 
    services.AddMvc(); 
} 

public void Configure(
    IApplicationBuilder app, 
    IHostingEnvironment env) { 
    if (env.IsDevelopment()) { 
     app.UseDeveloperExceptionPage(); 
    } else { 
     app.UseExceptionHandler("/Home/Error"); 
    } 

    app.UseStaticFiles(); 
    app.UseAuthentication(); 
    app.UseMvc(); 
} 

ServiceCollectionExtensions.cs

ich nur an der Quelle suchte den eingebauten AddIdentity<TUser, TRole> und weggelassen, um die Rolle verwandte Sachen, also sollte es hier kein Problem geben, aber vielleicht ...

public static class ServiceCollectionExtensions { 
    public static IdentityBuilder AddIdentity<TUser>(
     this IServiceCollection services, 
     Action<IdentityOptions> optionsAction = null) 
     where TUser : class { 
     services.AddAuthentication(
      o => { 
       o.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; 
       o.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; 
       o.DefaultSignInScheme = IdentityConstants.ApplicationScheme; 
      }).AddCookie(
      o => { 
       o.LoginPath = new PathString("/Login"); 
       o.Events = new CookieAuthenticationEvents { 
        OnValidatePrincipal = SecurityStampValidator.ValidatePrincipalAsync 
       }; 
      }); 

     services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>(); 
     services.TryAddScoped<IUserValidator<TUser>, UserValidator<TUser>>(); 
     services.TryAddScoped<IPasswordValidator<TUser>, PasswordValidator<TUser>>(); 
     services.TryAddScoped<IPasswordHasher<TUser>, PasswordHasher<TUser>>(); 
     services.TryAddScoped<ILookupNormalizer, UpperInvariantLookupNormalizer>(); 
     services.TryAddScoped<IdentityErrorDescriber>(); 
     services.TryAddScoped<ISecurityStampValidator, SecurityStampValidator<TUser>>(); 
     services.TryAddScoped<IUserClaimsPrincipalFactory<TUser>, UserClaimsPrincipalFactory<TUser>>(); 
     services.TryAddScoped<UserManager<TUser>, AspNetUserManager<TUser>>(); 
     services.TryAddScoped<SignInManager<TUser>, SignInManager<TUser>>(); 

     if (optionsAction != null) { 
      services.Configure(optionsAction); 
     } 

     return new IdentityBuilder(typeof(TUser), services); 
    } 
} 

Ich dachte, ich müsste den Autorisierungsfilter wie in MVC 5 hinzufügen, aber ich kann es nicht global tun. Wenn ich es auf den Standard-Controller anwenden, erhalte ich die folgende Ausnahme:

Kein AuthenticationScheme wurde angegeben, und es gab keine DefaultChallengeScheme gefunden.

Aber ich dachte, ich würde das Schema in meiner benutzerdefinierten AddIdentity Methode festlegen? Ich könnte eine Anleitung gebrauchen und ich schätze es, wenn mir jemand auf meine Weise geschickt wird.

+0

Haben passieren Sie das Schema in als Teil des Autorisieren Attribut in der Steuerung? Wie folgt: '[Authorize (AuthenticationSchemes = IdentityConstants.ApplicationScheme)]' oder so ähnlich? Ich weiß nicht, ob 'IdentityConstants.ApplicationScheme' das Enum ist, das Sie benötigen. –

+0

Also habe ich "Identity.Application" als das Schema, wie Sie vorgeschlagen haben, fest programmiert, und jetzt hat sich die Ausnahme in 'No authentication handler ist konfiguriert, um sich für das Schema zu authentifizieren: Identity.Application' geändert. Ich habe eine harte Zeit mit diesen Systemen. Was wäre die richtige Art, ASP.NET einfach mitzuteilen, dass ich Cookie-Authentifizierung mit Identity möchte? – Gup3rSuR4c

Antwort

1

Ich fand es heraus, und es war ich etwas übersehen, wenn ich meine eigene AddIdentity Erweiterung machte. Ich sollte die IdentityConstants.ApplicationScheme als Parameter an AddCookievor übergeben, die Optionen übergeben. Ich überprüfte die Identity-Quelle doppelt und sah, dass ich das vermisste. Sobald ich es hinzugefügt habe, hat alles funktioniert.Also:

//   ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ this is what was missing 
}).AddCookie(IdentityConstants.ApplicationScheme, 
o => { 

Dies war letztlich ein Problem habe ich selbst gemacht ...

0

Ich hatte das gleiche Problem wie Sie. Ich musste benutzerdefinierte Authentifizierung basierend auf FormsAuthentication Cookie implementieren, die nicht in .net Kern existiert, haben wir einige ASP.Net-Systeme, die FormsAuthentication verwenden und wir brauchen Interop. Die Art, wie ich es gelöst habe, war die Unterklasse AuthorizeFilter und dann overrideOnAuthorizationAsync(AuthorizationFilterContext context). Dies ist, was ich cam oben mit:

public class AuthFilter : AuthorizeFilter 
{ 

    public override Task OnAuthorizationAsync(AuthorizationFilterContext context) 
    { 
     if (context.Filters.Any(item => item is IAsyncAuthorizationFilter && item != this || item is IAllowAnonymousFilter)) 
     { 
      return Task.FromResult(0); 
     } 

     if (!context.HttpContext.User.Identity.IsAuthenticated) 
     { 
      context.Result = new UnauthorizedResult(); 
      return Task.FromResult(0); 
     } 

     return base.OnAuthorizationAsync(context); 
    } 

} 

Dann müssen Sie, dass in ConfigureServices heißt

diese Standardeinstellung wird
services.AddMvc(options => 
{ 
    options.Filters.Add(new AuthFilter(
     new AuthorizationPolicyBuilder() 
      .RequireAuthenticatedUser() 
      .Build())); 
}); 

in Startup.cs gehen registrieren machen alle Ihre Controller Genehmigung benötigen. Wenn Sie anonyme Anmeldung benötigen, gehen Sie zu Ihrem Controller

+0

Da alle meine Controller von einer 'ControllerBase'-Klasse erben, habe ich das Attribut darauf angewendet, aber es wirft jetzt andere Ausnahmen auf, wenn ich keinen registrierten Handler für das Schema finde. – Gup3rSuR4c

Verwandte Themen