2017-12-12 3 views
1

Ich schreibe eine ASP.Net Core 2.0 Web App und ich versuche, Azure AD B2C für die Authentifizierung zu verwenden.500 Fehler, wenn Azure AD B2C signin-oidc Callback ruft

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<SchoolContext>(options => 
    options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"))); 

    JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

    services.AddAuthentication(options => 
    { 
     options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 
     options.DefaultSignInScheme = JwtBearerDefaults.AuthenticationScheme; 
     options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; 
    }) 
    .AddJwtBearer(options => 
    { 
     options.Authority = "https://login.microsoftonline.com"; 
     options.Audience = "aud"; 
     options.Events = new JwtBearerEvents 
     { 
     OnAuthenticationFailed = t => 
     { 
      return Task.FromResult(0); 
     } 
     }; 
    }) 
    .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options => 
    { 
     options.MetadataAddress = $"https://login.microsoftonline.com/{Configuration["AzureAdB2C:Tenant"]}/v2.0/.well-known/openid-configuration?p={Configuration["AzureAdB2C:Policy"]}"; 
     options.ClientId = Configuration["AzureAdB2C:ClientId"]; 
     options.Events = new OpenIdConnectEvents { OnAuthenticationFailed = AuthenticationFailed, OnTokenValidated = Validated, OnRemoteFailure = Failed }; 
     options.SaveTokens = true; 
    }); 

    services.AddCors(o => o.AddPolicy("MyPolicy", builder => 
    { 
    builder.AllowAnyOrigin() 
     .AllowAnyMethod() 
     .AllowAnyHeader() 
     .AllowCredentials(); 
    })); 

    services.AddMvc(); 

    services.Configure<MvcOptions>(options => 
    { 
    options.Filters.Add(new CorsAuthorizationFilterFactory("MyPolicy")); 
    }); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
{ 
    app.UseAuthentication(); 

    if (env.IsDevelopment()) 
    { 
    var builder = new ConfigurationBuilder(); 
    builder.AddUserSecrets<Startup>(); 

    app.UseDeveloperExceptionPage(); 
    app.UseWebpackDevMiddleware(new WebpackDevMiddlewareOptions 
    { 
     HotModuleReplacement = true, 
     ReactHotModuleReplacement = true 
    }); 
    } 
    else 
    { 
    app.UseExceptionHandler("/Home/Error"); 
    } 

    app.UseStaticFiles(); 
    app.UseCors("MyPolicy"); 
    app.UseMvc(); 
} 

Ich habe ein [Authorize] Attribut auf einer Controller-Aktion, und wenn ich den Link, den ich mit der Microsoft-Anmeldeseite erhalten vorgestellt folgen. Ich logge mich erfolgreich ein und es leitet mich zurück zu https://localhost:[PORT]/signin-oidc, der einen Fehler des 500 Servers zurückbringt.

Meine Frage ist, weiß jemand, warum das passiert? Ich dachte, es könnte etwas mit CORS zu tun haben, aber es sieht nicht so aus. Der Beitrag von Microsoft scheint ein gültiges Token zu enthalten.

+0

Sie müssen das Problem mehr debuggen. Ein Fehler von 500 könnte irgendetwas bedeuten. Obwohl auf diese Weise Ihre JWT Bearer Auth falsch konfiguriert ist. Die Autorität verweist nicht auf eine geeignete Autorität, und die Zielgruppe sollte die Client-ID/App-ID-URI sein. – juunas

+0

Wenn Sie einen Haltepunkt auf 'OnAuthenticationFailed' hinzufügen, wird er dann getroffen? Wenn ja, inspizieren Sie "t" und sehen Sie, ob es weitere Details gibt. – Saca

+0

Ich habe Haltepunkte auf OnAuthenticationFailed hinzugefügt, aber es wird nicht getroffen. Irgendwelche Vorschläge darüber, was ich noch zum Debuggen tun kann? – Dave

Antwort

0

Das Visual Studio Debug-Fenster enthält normalerweise einige nützliche Informationen zur Fehlerbehebung.


würde ich Ihren Startcode ändern this sample übereinstimmen (entfernen Sie den Aufruf von AddOpenIdConnect()):

services.AddAuthentication(options => 
{ 
    options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme; 
}) 
    .AddJwtBearer(jwtOptions => 
    { 
     jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["AzureAdB2C:Tenant"]}/{Configuration["AzureAdB2C:Policy"]}/v2.0/"; 
     jwtOptions.Audience = Configuration["AzureAdB2C:ClientId"]; 
     jwtOptions.Events = new JwtBearerEvents 
     { 
     OnAuthenticationFailed = AuthenticationFailed 
     }; 
}); 

Ich würde auch einen Handler OnMessageReceived in JwtBearerEvents hinzuzufügen. Setzen Sie einen Haltepunkt auf diesen Handler und sehen Sie, ob Sie so weit kommen.