我使用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 :(得分:0)
啊!登录呼叫使用LOCAL api,而其余路由使用生产API。修复解决了我的问题。