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());
}
正常にログインした後に値が含まれていれば、httpリクエストの承認ヘッダーを確認しましたか? –