2016-01-13 14 views
5

Sto costruendo un API utilizzando asp.net 5 rc2. Sto cercando di implementare openiddict-core, trovato here per gli account locali e voglio anche consentire agli utenti di utilizzare login esterni, come google.Nessun gestore di autenticazione è configurato per l'autenticazione per lo schema: Microsoft.AspNet.Identity.External

ho installato il tutto, ma quando provo a implementare l'autenticazione di Google, e io chiamo questo codice

var info = await _signInManager.GetExternalLoginInfoAsync();

ricevo il messaggio di errore nel titolo.

Sul client che sto utilizzando Satellizer ha trovato here, che si occupa di aprire la finestra del prompt di google e di inviare il callback al mio metodo Google AuthController, che è il normale codice ChallengeResult che si vede in altri esempi di mvc6.

Ho scritto il codice per ottenere i dettagli utenti manualmente e che funziona, ma ho pensato di utilizzare il signInManager già costruito, invece, piuttosto che riprodurre la ruota ...

io non ho impostare le cose in modo corretto , dato che tutti gli esempi sembrano utilizzare i cookie, il che credo sia dovuto al fatto che si tratta di applicazioni Web mvc6, non di API. Non voglio usare i cookie, ma questo potrebbe essere il mio problema.

Ora per un po 'di codice.

startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    // Add MVC services to the services container. 
    services.AddMvc(); 

    services.AddEntityFramework() 
     .AddSqlServer() 
     .AddDbContext<ApplicationDbContext>(options => 
     options.UseSqlServer(_configuration["Data:DefaultConnection:ConnectionString"])); 

    services.AddIdentity<ApplicationUser, IdentityRole>() 
     .AddEntityFrameworkStores<ApplicationDbContext>() 
     .AddDefaultTokenProviders() 
     .AddOpenIddict(); // Add the OpenIddict services after registering the Identity services. 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
{ 
    // use jwt bearer authentication 
    app.UseJwtBearerAuthentication(options => 
    { 
     options.AutomaticAuthenticate = true; 
     options.AutomaticChallenge = true; 
     options.RequireHttpsMetadata = false; 
     options.Audience = "http://localhost:5000/"; 
     options.Authority = "http://localhost:5000/"; 
    }); 

    // Add all the external providers you need before registering OpenIddict: 
    app.UseGoogleAuthentication(options => 
    { 
     options.AutomaticAuthenticate = true; 
     //options.AutomaticChallenge = true; 
     options.ClientId = "XXX"; 
     options.ClientSecret = "XXX"; 
    }); 
    //app.UseFacebookAuthentication(); 

    app.UseOpenIddict(); 

    // Enable all static file middleware 
    app.UseStaticFiles(); 

    // Enable Mvc for view controller, and 
    // default all routes to the Home controller 
    app.UseMvc(options => 
    { 
     options.MapRoute(
      name: "default", 
      template: "{*url}", 
      defaults: new { controller = "Home", action = "Index" }); 
    }); 
} 

AuthController.cs

public class AuthController : Controller 
{ 
    private UserManager<ApplicationUser> _userManager; 
    private SignInManager<ApplicationUser> _signInManager; 
    private ApplicationDbContext _applicationDbContext; 

    public AuthController(
     UserManager<ApplicationUser> userManager, 
     SignInManager<ApplicationUser> signInManager, 
     ApplicationDbContext applicationDbContext) 
    { 
     _userManager = userManager; 
     _signInManager = signInManager; 
     _applicationDbContext = applicationDbContext; 
    } 

    [HttpPost("google")] 
    public async Task<IActionResult> GoogleAsync([FromBody] ExternalLoginModel model) 
    { 
     // THIS IS WHERE ERROR OCCURS 
     var info = await _signInManager.GetExternalLoginInfoAsync(); 


     return Ok(); 
    } 
} 

ExternalLoginModel.cs

public class ExternalLoginModel 
{ 
    public string Code { get; set; } 

    public string ClientId { get; set; } 

    public string RedirectUri { get; set; } 
} 
+2

Possibile duplicato di [Nessun gestore di autenticazione è configurato per gestire lo schema: Automatico] (https://stackoverflow.com/questions/33825058/no-authentication-handler-is-configured-to-handle-the-scheme- automatico) –

risposta

14

Hai provato la registrazione del middleware di identità con l'aggiunta di app.UseIdentity(); prima di registrare il middleware GoogleAuthentication ?

+1

Hai ragione, se aggiungo questo funziona benissimo. Ma questo utilizza i cookie, come posso non usare i cookie ?? – Gillardo

+0

Sembra che usi i cookie e apprezzo il tuo commento iniziale che ha dichiarato che non vuoi usarli. Tuttavia, il metodo che stai chiamando qui 'GetExternalLoginInfoAsync();' fa uso dell'autenticazione dei cookie quando effettua questa chiamata 'var auth = new AuthenticateContext (Options.Cookies.ExternalCookieAuthenticationScheme);'. È possibile trovare il codice qui: [SignInManager.cs] (https://github.com/aspnet/Identity/blob/58b2cf6c7dc946d0fce27f1fda150bbeb0e1a1fd/src/Microsoft.AspNet.Identity/SignInManager.cs). –

+0

Hai dato un'occhiata all'altra struttura di Pinpoint [ASOS] (https://github.com/aspnet-contrib/AspNet.Security.OpenIdConnect.Server)? Lo sto usando al momento e sto vivendo una buona esperienza fino ad ora. Credo anche che sarebbe più adatto alle tue esigenze. C'è anche molta più documentazione per esso attualmente su StackOverflow, openiddict è ancora relativamente giovane in confronto. –

Problemi correlati