2014-04-23 7 views
7

W moim kodzie produkcyjnym mamy problem, gdy Request.GetOwinContext() zawsze zwraca wartość null.ASP.Net WebAPI OWIN: Dlaczego Request.GetOwinContext() zwróci wartość null?

I konfiguracja mały kontroler testu WebAPI spróbować wyizolować problem:

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(); 
    } 
} 

Na początku myślałem, że może to mieć coś wspólnego z metodą akcja działa asynchronicznie, ale po uruchomieniu powyższego okazuje że w obu wersjach Request.GetOwinContext() zwraca wartość null.

Używam Microsoft.AspNet.WebApi.Owin.5.1.1 (w którym wydaje się, że została zdefiniowana metoda rozszerzenia GetOwinContext()).

Wszelkie pomysły na to, co się tutaj dzieje?

+0

Czy jesteś pewien, że wywoływana jest klasa uruchamiania i wszystkie moduły są rejestrowane? – William

Odpowiedz

3

Napotkałem podobny problem. Aby rozwiązać ten problem upewnij się poniżej linii (z wezwaniem do sposobu CreatePerOwinContext) istnieją w Startup.Auth.cs pliku w ConfigureAuth

metody.

Twoja metoda może wyglądać

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

Dawka ApplicationRoleManager nie istnieje w bieżącym kontekście –

11

inna przyczyna (zwłaszcza po aktualizacji formularza ASP.NET MVC4 i/lub szablon WebAPI pusty) brakuje pliku Startup.cs w katalogu głównym projektu WebAPI.

Upewnij się również, że masz zainstalowany pakiet 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

Naprawiono dla mnie instalację 'Microsoft.Owin.Host.SystemWeb' z Nuget. –

+0

nie naprawiaj problemu dla mnie. –

Powiązane problemy