我有一个Azure移动应用程序,使用FB和Twitter在azure上进行身份验证。我能够登录到两者但是当在本地测试web api调用(在IIS中托管)时 - 任何具有Authorize属性的控制器 - 返回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);
}
我在文档中看到有关使用从asp.net传入的全局http配置或创建新配置的引用 - 我尝试引用GlobalConfiguration.Configuration而不是创建新实例但它没有帮助
有没有办法挂钩到OWIN管道以查看令牌是否正在进入应用服务认证模块?
[编辑] ZUMO AUTH HEADER 我还添加了x-zumo-auth标头,并将其值设置为当前用户的令牌,如下所示
request.headers.append('X-ZUMO-AUTH',
app.azureClient.currentUser.mobileServiceAuthenticationToken)
我可以在向api发出的每个请求中看到它。使用此机制调用端点https:// mysite .azurewebsites.net / .auth / me正在返回正确的响应,因此我知道令牌有效。
[编辑] 在添加ZUMO版本标题后验证在Azure中工作 将web api部署到azure并尝试调用我的web api端点并收到错误的请求错误。事实证明它需要一个额外的标题
'ZUMO-API-VERSION', '2.0.0'
我添加了标题并且它有效。
使用版本标题再次尝试本地调用但仍然获得401。
我可以假设OWIN中间件可能由于配置问题而没有收到令牌 - 需要对管道进行一些透明度来测试其中一些理论 - 不确定最佳方法
在解决此问题时,不确定下一步该向下看。
[编辑] OWIN管道验证阶段挂钩 OK - 想想如何在OWIN中设置等效的asp.net管道事件处理程序 - 在我的启动文件中,我添加了此代码,以便在到达Authenticate阶段时执行
app.Use((context, next) =>
{
return next.Invoke();
});
app.UseStageMarker(PipelineStage.Authenticate);
添加了一个断点,当调试器停止时,我可以在调用堆栈中看到它 Azure App Service中间件在管道中
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,而visual studio正在抱怨源代码与构建模块时不同。因此,我无法单步执行代码来查看正在捕获的异常。
[编辑] 构建并引用v1.1.157.1 DLL - 异常类型现在可见
在调用
时的ValidateIdentity方法中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'."
[编辑] 最终找到并修复了问题
在GitHub上发布了一个与IdentityServer有关的问题,该问题与使用nuget包进行了重大更改 - 来自v4 - &gt; System.IdentityModel.TokensJwt包的v5。
https://github.com/IdentityServer/IdentityServer3/issues/3017
我将我的安装降级到v4.0.x并修复了异常并修复了我在本地运行时看到的401错误。
一切都很好
答案 0 :(得分:1)
您是否在web.config中为authSigningKey
,authAudience
和authIssuer
设置了正确的应用设置?
仅供参考 - 如果你还没有偶然发现这个设置,那么这个设置就会很好:http://www.systemsabuse.com/2015/12/04/local-debugging-with-user-authentication-of-an-azure-mobile-app-service/
答案 1 :(得分:1)
您的本地主机是否提供https流量? 如果控制器使用[授权]进行修饰,则需要通过https进行请求/响应。
如果你定位http://localhost,[授权]会导致302到https://localhost。
这302可以打破身份验证过程。解决方案是在本地提供https,将客户端指向适当的端口(我的方框使用:44300),然后再试一次。
另外,请确保所有相关的重定向网址都转到您正在使用的网址的https://版本。