2014-04-23 39 views
7

Nel mio codice di produzione stiamo riscontrando un problema in cui Request.GetOwinContext() restituisce sempre null.ASP.Net WebAPI OWIN: Perché Request.GetOwinContext() restituisce null?

I ha installato un piccolo controller di test WebAPI per cercare di isolare il problema:

public class TestController : ApiController 
{ 
    [HttpGet] 
    public async Task<IHttpActionResult> GetAsyncContext(string provider) 
    { 
     if (HttpContext.Current.GetOwinContext() == null) 
      return this.BadRequest("No HttpContext.Current Owin Context"); 

     if (Request.GetOwinContext() == null) 
      return this.BadRequest("No Owin Context"); 

     return this.Ok(); 
    } 

    [HttpGet] 
    public IHttpActionResult GetContext(string provider) 
    { 
     if (HttpContext.Current.GetOwinContext() == null) 
      return this.BadRequest("No HttpContext.Current Owin Context"); 

     if (Request.GetOwinContext() == null) 
      return this.BadRequest("No Owin Context"); 

     return this.Ok(); 
    } 
} 

In un primo momento ho pensato che potrebbe avere qualcosa a che fare con il metodo di azione in esecuzione in modo asincrono, ma dopo aver eseguito quanto sopra, si trasforma fuori che in entrambe le versioni, Request.GetOwinContext() restituisce null.

Sto usando Microsoft.AspNet.WebApi.Owin.5.1.1 (che è dove sembra che sia definito il metodo di estensione GetOwinContext()).

Qualche idea su cosa sta succedendo qui ???

+0

Sei certa classe di avvio viene chiamato e tutti i moduli sono stati registrati? – William

risposta

3

Ho riscontrato un problema simile. Per risolvere questo problema assicurarsi di seguito le linee (con chiamata al metodo CreatePerOwinContext) ci sono nel vostro Startup.Auth.cs file in ConfigureAuth metodo

.

Il vostro metodo può apparire come

public void ConfigureAuth(IAppBuilder app) 
    { 
     // Configure the db context, user manager and role manager to use a single instance per request 
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
     app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 
     app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

     // Enable the application to use a cookie to store information for the signed in user 
     // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
     // Configure the sign in cookie 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     }); 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

     // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process. 
     app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 

     // Enables the application to remember the second login verification factor such as phone or email. 
     // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from. 
     // This is similar to the RememberMe option when you log in. 
     app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 

     // Uncomment the following lines to enable logging in with third party login providers 
     //app.UseMicrosoftAccountAuthentication(
     // clientId: "", 
     // clientSecret: ""); 

     //app.UseTwitterAuthentication(
     // consumerKey: "", 
     // consumerSecret: ""); 

     //app.UseFacebookAuthentication(
     // appId: "", 
     // appSecret: ""); 

     //app.UseGoogleAuthentication(
     // clientId: "", 
     // clientSecret: ""); 
    } 
+0

La dose ApplicationRoleManager non esiste nel contesto corrente –

11

Un'altra causa (soprattutto dopo l'aggiornamento modulo ASP.NET MVC4 e/o vuoto WebAPI Template) manca il file Startup.cs nella root del progetto di WebAPI.

Inoltre, assicurarsi di aver installato il pacchetto Microsoft.Owin.Host.SystemWeb.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Microsoft.Owin; 
using Owin; 

[assembly: OwinStartup(typeof(TestMVC5.Startup))] 

namespace TestMVC5 
{ 
    public partial class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      ConfigureAuth(app); 
     } 
    } 
} 
+4

La correzione per me era l'installazione di 'Microsoft.Owin.Host.SystemWeb' con Nuget. –

+0

non risolverà il problema per me. –

Problemi correlati