";该请求的授权已被拒绝”;仅在生产环境中

本文关键字:拒绝 生产环境 quot 请求 授权 | 更新日期: 2023-09-27 18:12:21

我使用WebAPI和Owin进行以下身份验证设置。在本地,我可以注册,获取令牌,并发出带有[Authorize]注释的API请求。在生产中,我可以注册并获得一个令牌,但当我尝试使用[Authorize]注释到达端点时,标题中会出现错误。

考虑到它在本地工作,我怀疑这是否是一个代码问题。我构建并将所有.dll部署到生产服务器,因此引用都应该是相同的版本。这可能是IIS配置的不同吗?比较两者,我没有看到任何东西向我扑来,但我可能错过了什么。

如果重要的话,我会使用Visual Studio中的Web Deploy将网站推向生产环境。我还将完全相同的web.config用于两种环境,只是我转换了生产的连接字符串。

启动.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());
}

";该请求的授权已被拒绝”;仅在生产环境中

啊!登录调用使用LOCAL api,而其余路由使用生产api。解决了这个问题。