2014-04-23 6 views
7

In meinem Produktionscode haben wir ein Problem, wo Request.GetOwinContext() immer Null zurückgibt.ASP.Net WebAPI OWIN: Warum würde Request.GetOwinContext() null zurückgeben?

ich Setup ein kleiner Test WebAPI Controller und zu isolieren, um das Problem zu versuchen:

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

Zuerst dachte ich, es hat etwas mit der Aktion-Methode läuft asynchron zu tun haben könnte, aber nach dem oben ausgeführt, stellt sich In beiden Versionen gibt Request.GetOwinContext() null zurück.

Ich verwende Microsoft.AspNet.WebApi.Owin.5.1.1 (das ist, wo es die GetOwinContext() Erweiterungsmethode scheint definiert ist).

Alle Ideen, was hier passiert ???

+0

Sind Sie sicher, dass die Startup-Klasse aufgerufen wird und alle Module registriert sind? – William

Antwort

3

Ich stieß auf ähnliches Problem. Um dies zu beheben unten Linien sicher machen (mit Aufruf der Methode CreatePerOwinContext) gibt es in Ihrer Startup.Auth.cs Datei in ConfigureAuth

Methode.

Ihre Methode

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

ApplicationRoleManager Dosis existiert nicht im aktuellen Kontext –

11

Eine weitere Ursache (vor allem nach Form ASP.NET MVC4 aktualisieren und/oder leere WebAPI Template) aussehen kann fehlen Startup.cs Datei im Stammverzeichnis des WebAPI Projektes.

Stellen Sie außerdem sicher, dass Sie Microsoft.Owin.Host.SystemWeb Paket installiert haben.

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

Die Lösung für mich war die Installation von 'Microsoft.Owin.Host.SystemWeb' mit Nuget. –

+0

behebt das Problem nicht für mich. –

Verwandte Themen