2016-07-25 23 views
3

我有一个Azure移动应用程序,使用FB和Twitter在azure上进行身份验证。我可以登录到两者,但在本地测试web api调用时(在IIS中托管) - 任何具有Authorize属性的控制器 - 返回401.在Azure中进行身份验证,但在本地主机上调用web api - 401

alternateLoginHost设置为Azure主机,它向我提供了一个令牌成功登录后。

我按照文档中有关使用身份验证设置本地调试的说明。

它使用基于属性的路由 - config.MapHttpAttributeRoutes()

这里是我的全OWIN启动类

public class OwinStartup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     HttpConfiguration config = new HttpConfiguration(); 

     config.MapHttpAttributeRoutes(); 

     new MobileAppConfiguration() 
      .ApplyTo(config); 

     app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions() 
     { 
      SigningKey = ConfigurationManager.AppSettings["authSigningKey"], 
      ValidAudiences = new[] { ConfigurationManager.AppSettings["authAudience"] }, 
      ValidIssuers = new[] { ConfigurationManager.AppSettings["authIssuer"] }, 
      TokenHandler = config.GetAppServiceTokenHandler() 
     }); 

     app.UseWebApi(config); 

    } 

我已经看到了有关或者使用传入的全球HTTP配置文档中引用从asp.net或创建一个新的 - 我尝试引用GlobalConfiguration.Configuration而不是创建一个新的实例,但它没有帮助。

有没有办法挂钩到OWIN管道中,看看令牌是否使它进入应用服务认证模块?

[编辑] 谟AUTH HEADER 我也加入了X-谟-auth的头并设置它从这样

request.headers.append('X-ZUMO-AUTH', 
app.azureClient.currentUser.mobileServiceAuthenticationToken) 

当前用户价值的令牌,我可以看到它在每个请求都是对api进行的。使用此机制对端点https:// mysite .azurewebsites.net/.auth/me的调用正在返回正确的响应,因此我知道该标记是有效的。

[编辑] 验证了Azure的工作增加谟版本包头 部署的网络API天青,并试图打电话给我的Web API端点,并收到了错误的请求错误后。原来,它需要一个额外的头版本

'ZUMO-API-VERSION', '2.0.0' 

我添加了标题,它的工作。

再次尝试本地通话与版本头,但仍然得到401

所有我可以假设是OWIN中间件没有收到令牌可能是由于配置问题 - 需要一些透明度进入管道,以测试这些理论中的一些 - 不确定最好的办法做到这一点

不知道下一步解决这个问题。

[编辑] OWIN管道验证阶段钩 好 - 想想如何设置相当于ASP。在OWIN净管道的事件处理程序 - 在我的启动文件中添加此代码时达到

 app.Use((context, next) => 
     { 
      return next.Invoke(); 
     }); 
     app.UseStageMarker(PipelineStage.Authenticate); 

添加了身份验证阶段断点和执行时,调试器停止,我可以看到,在调用堆栈 的天青应用服务中间件在管道

Microsoft.Owin.Security.Infrastructure.AuthenticationMiddleware 
<Microsoft.Azure.Mobile.Server.Authentication.AppServiceAuthenticationOptions> 
.Invoke(Microsoft.Owin.IOwinContext context) 

确认OWINContext.Request.Headers包含正确的身份验证令牌

在调试展望令牌确实在OWIN管道的Authenticate阶段的Context.Request.Headers集合中,并且它具有正确的值。出于某种原因,仍然收到401个状态

我加倍检查我使用的SigningKey价值 - 从Azure中WEBSITE_AUTH_SIGNING_KEY值复制。

[编辑] 调试与源和异常在ValidateIdentity被抛出

AppServiceAuthenticationHandler.ValidateIdentity 

下载源v1.1.157.1,从symbolsource加载符号,但这些被标记为1.0.157.1和视觉工作室抱怨源与模块构建时不同。正因为如此,我无法通过代码来查看正在捕获的异常。

[编辑] 内置和参考v1.1.157.1 DLL - 时,它调用

options.TokenHandler.TryValidateLoginToken 

以下抛出异常

"Could not load type 'System.IdentityModel.Tokens.JwtSecurityToken' 
from assembly 'System.IdentityModel.Tokens.Jwt, Version=5.0.0.127, 
Culture=neutral, PublicKeyToken=31bf3856ad364e35'." 
异常类型现在可见

在ValidateIdentity方法

[编辑] 最后终于找到并解决了该问题

在GitHub上为IdentityServer发布的一个问题与使用nuget包进行重大更改有关 - 从System.IdentityModel.TokensJwt包的v4 - > v5进行。

https://github.com/IdentityServer/IdentityServer3/issues/3017

我降级我安装到v4.0.x和它固定的异常,也是固定的401错误本地运行的时候,我看到的。

所有这些都是好的,现在

+0

很高兴听到它。我们将尝试查看符号源问题的具体情况,也许我们可以采取一些措施来使这些错误更易于检测。 – brettsam

+0

我将System.IdentityModel.TokensJwt从5.1.0降级到4.0.3.308261200,现在它也适用于本地。非常感谢您提供的解决方案。 – Sergey

回答

1

是您的本地主机服务HTTPS流量? 如果控制器装有[授权],它将要求通过https发送请求/响应。

如果你的目标是http://localhost,[授权]会导致302到https://localhost

这302可以打破认证过程。解决方法是在本地提供https,将您的客户端指向适当的端口(我的盒子使用:44300),然后再次尝试。

此外,请确保任何相关的重定向网址转到您使用的网址的https://版本。

+0

是的 - 我使用开发证书在https端口443下运行本地主机 – MIantosca

相关问题