2014-11-05 78 views
0

我有一个自托管的asp.net web api。我有几个API工作正常。所有要求都达到API方法并且响应客户。 现在我尝试为web-api添加授权。CreatePerOwinContext在owin自我托管的web-api中导致404响应

我通过添加AUTH SECTION来更改我的启动配置。

static void Main(string[] args) 
     { 
      StartOptions startOptions = new StartOptions(); 
      startOptions.Urls.Add("https://*:44305/"); 
      startOptions.Urls.Add("http://*:9001/"); 
      using (Microsoft.Owin.Hosting.WebApp.Start<dobStartUp>(startOptions)) 
      { 
       //... 
      } 
     } 
    public class dobStartUp 
    { 
     public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

     public static string PublicClientId { get; private set; } 

     public void Configuration(IAppBuilder app) 
     { 
      //----AUTH SECTION--- 
      app.CreatePerOwinContext(ApplicationDbContext.Create); 
      app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
      // PublicClientId = "self"; 
      // OAuthOptions = new OAuthAuthorizationServerOptions 
      // { 
      //  TokenEndpointPath = new PathString("/Token"), 
      //  Provider = new ApplicationOAuthProvider(PublicClientId), 
      //  AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"), 
      //  AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
      //  AllowInsecureHttp = true 
      // }; 
      // app.UseOAuthBearerTokens(OAuthOptions); 
      //------------- 

      var config = new HttpConfiguration(); 
      config.SuppressDefaultHostAuthentication(); 
      config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 
      config.Services.Replace(typeof(IAssembliesResolver),new dobAssembliesResolver()); 
      config.Formatters.Clear(); 
      config.Formatters.Add(new JsonMediaTypeFormatter()); 
      config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings(); 
      // config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new Common.dobJsonContractResolver(); 
      var container = new UnityContainer(); 
      container.RegisterType<IdobRDBRepository, dobRDBRepository>(new TransientLifetimeManager()); 
      container.RegisterType<IResourcesContentRepository, AS3ContentRepository>(new TransientLifetimeManager()); 
      SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing(); 
      traceWriter.IsVerbose = false; 
      traceWriter.MinimumLevel = TraceLevel.Debug; 
      config.DependencyResolver = new UnityDependencyResolver(container); 
      config.MapHttpAttributeRoutes(); 
      app.UseWebApi(config); 
     } 
    } 

当我在AUTH-部分使用app.CreatePerOwinContext,方法可以创建appDbContext和appUserManager被调用,但我对每个API方法404个responces。当我不这样调用这些CreatePerOwinContext方法时,每个工作都照常进行。我知道我可以使用IoC容器来创建dbContext和userManager的实例,但是我想了解我的app.CreatePerOwinContext和404响应的当前问题。 预先感谢大家。

回答

0

我发现404响应的原因。这是因为自定义程序集解析器。我有控制器在单独的DLL,这就是为什么我使用自定义程序集解析器,我手动加载与API控制器的程序集。这工作得很好,直到我在owin管道中只使用web-api。 接下来我尝试向web api添加授权 - 我使用了[CreatePerOwinContext]和[app.UseOAuthBearerTokens],因此我添加了中间件。它在web-api开始创建任何控制器之前加载引用的程序集。如果我在调试时理解正确,我已经加载了两次api-controllers程序集。所以它在创建控制器实例的时候造成了冲突。

+0

我不确定你的解决方案是什么。你可以粘贴你的新代码吗?谢谢! – Matt 2015-01-25 02:00:16