2016-10-10 3 views
0

WebAPIとOwinを次の認証設定で使用しています。ローカルでは、私は登録することができ、トークンを取得し、それらに[Authorize]アノテーションを持つAPIリクエストを行うことができます。プロダクションではを登録してのトークンを得ることができますが、[Authorize]アノテーションでエンドポイントにヒットしようとすると、タイトルにエラーが表示されます。プロダクション環境でのみ、この要求に対する承認が拒否されました

ローカルで動作することを考えると、私はそれがコードの問題だと懐疑的です。また、すべての.dllをビルドして本番サーバーに展開するので、参照はすべて同じバージョンにする必要があります。 IIS構成の違いかもしれませんか?両者を比較すると、私に何か飛び跳ねることはありませんが、何かが欠けている可能性があります。

重要な場合は、Visual StudioのWeb Deployを使用して、サイトを本番環境にプッシュします。私は、生産用の接続文字列を変換することを除いて、両方の環境で全く同じweb.configを使用します。

Startup.cs

[assembly: OwinStartup(typeof(MyProject.API.Startup))] 
namespace MyProject.API 
{ 
    public partial class Startup 
    { 
     public void Configuration(IAppBuilder app) 
     { 
      ConfigureAuth(app); 
     } 
    } 
} 

App_Start \ Startup.Auth.cs

namespace MyProject.API 
{ 
    public partial class Startup 
    { 
     public static OAuthAuthorizationServerOptions OAuthOptions { get; private set; } 

     public static string PublicClientId { get; private set; } 

     public void ConfigureAuth(IAppBuilder app) 
     { 
      // Allow access_token to be passed as a query parameter 
      app.Use(async (context, next) => 
      { 
       if (context.Request.QueryString.HasValue) 
       { 
        if (string.IsNullOrWhiteSpace(context.Request.Headers.Get("Authorization"))) 
        { 
         var queryString = HttpUtility.ParseQueryString(context.Request.QueryString.Value); 
         string token = queryString.Get("access_token"); 

         if (!string.IsNullOrWhiteSpace(token)) 
         { 
          context.Request.Headers.Add("Authorization", new[] { string.Format("Bearer {0}", token) }); 
         } 
        } 
       } 

       await next.Invoke(); 
      }); 

      app.CreatePerOwinContext(MyProjectDbContext.Create); 
      app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 

      app.UseCookieAuthentication(new CookieAuthenticationOptions()); 
      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 

      PublicClientId = "self"; 
      OAuthOptions = new OAuthAuthorizationServerOptions 
      { 
       TokenEndpointPath = new PathString("/Token"), 
       Provider = new ApplicationOAuthProvider(PublicClientId), 
       AuthorizeEndpointPath = new PathString("/account/ExternalLogin"), 
       AccessTokenExpireTimeSpan = TimeSpan.FromDays(14), 
       AllowInsecureHttp = true 
      }; 
      app.UseOAuthBearerTokens(OAuthOptions); 
     } 
    } 
} 

Global.asax.cs

protected void Application_Start() 
{ 
    GlobalConfiguration.Configure(WebApiConfig.Register); 
    DependencyInjectorConfig.RegisterDependencies(); 
    MappingConfig.RegisterMappings(); // Autofac stuff 
    Database.SetInitializer(new MyProjectInitializer()); 
} 
+0

正常にログインした後に値が含まれていれば、httpリクエストの承認ヘッダーを確認しましたか? –

答えて

0

ああ!ログインコールはローカルAPIを使用していましたが、残りのルートはプロダクションAPIを使用していました。私の問題を解決した修正。

関連する問題