"此请求的授权被拒绝"仅在生产环境中

时间:2016-10-10 23:39:38

标签: c# asp.net asp.net-web-api

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

1 个答案:

答案 0 :(得分:0)

啊!登录呼叫使用LOCAL api,而其余路由使用生产API。修复解决了我的问题。