我有一个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错误本地运行的时候,我看到的。
所有这些都是好的,现在
很高兴听到它。我们将尝试查看符号源问题的具体情况,也许我们可以采取一些措施来使这些错误更易于检测。 – brettsam
我将System.IdentityModel.TokensJwt从5.1.0降级到4.0.3.308261200,现在它也适用于本地。非常感谢您提供的解决方案。 – Sergey