2016-10-10 73 views
0

我正在使用WebAPI和Owin进行以下身份验证设置。在本地,我可以注册,获取令牌,并制作API请求,其中包含[Authorize]批注。在制作过程中,我可以注册并获得令牌,但当我尝试使用[授权]注释尝试点击终端时,标题中出现错误。仅在生产环境中“拒绝授权才能满足此请求”

鉴于它在本地工作,我怀疑这是一个代码问题。我将所有.dll构建并部署到生产服务器,因此引用应该都是相同的版本。它可能是IIS配置的差异吗?比较两者,我没有看到任何东西跳出来,但我可能会错过一些东西。

万一它很重要,我使用Visual Studio中的Web部署将网站推送到生产环境。对于这两种环境,我也使用完全相同的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

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