gpt4 book ai didi

azure-mobile-services - 在 Azure 中进行身份验证但在本地主机上调用 Web API - 401

转载 作者:行者123 更新时间:2023-12-01 14:44:58 25 4
gpt4 key购买 nike

我有一个 Azure 移动应用程序在 Azure 上通过 FB 和 Twitter 进行身份验证。我可以同时登录,但是在本地测试 Web API 调用时(托管在 IIS 中)——任何具有授权属性的 Controller ——返回 401。

alternateLoginHost 设置为 Azure 主机,它在成功登录后为我提供 token 。

我按照文档中关于使用身份验证设置本地调试的说明进行操作。

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

这是我完整的 OWIN 启动类(class)

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 管道以查看 token 是否进入应用服务身份验证模块?

[编辑] ZUMO 授权 header 我还添加了 x-zumo-auth header 并将其值设置为来自当前用户的 token

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

而且我可以在向 api 发出的每个请求中看到它。使用此机制对端点 https://mysite.azurewebsites.net/.auth/me 的调用返回正确的响应,因此我知道 token 有效。

[编辑] 添加 ZUMO 版本 header 后验证在 Azure 中工作将 web api 部署到 azure 并尝试调用我的 web api 端点并收到错误请求错误。事实证明它需要一个额外的版本头

'ZUMO-API-VERSION', '2.0.0'

我添加了 header ,它起作用了。

使用版本 header 再次尝试本地调用,但仍然收到 401。

我只能假设 OWIN 中间件没有收到 token 可能是由于配置问题 - 需要对管道有一定的透明度来测试其中的一些理论 - 不确定最好的方法

不确定下一步该去哪里解决这个问题。

[编辑] OWIN 管道身份验证阶段 Hook 好的 - 想通了如何在 OWIN 中设置与 asp.net 管道事件处理程序等效的方法 - 在我的启动文件中,我添加了这段代码以在到达身份验证阶段时执行

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

添加了一个断点,当调试器停止时,我可以在调用堆栈中看到它管道中的 Azure 应用服务中间件

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

确认的 OWINContext.Request.Headers 包含正确的 Auth Token

在调试器中查看 token 确实在 OWIN 管道的身份验证阶段的 Context.Request.Headers 集合中,并且它具有正确的值。由于某种原因仍然收到 401 状态

我仔细检查了我用于 SigningKey 的值 - 从 Azure 中的 WEBSITE_AUTH_SIGNING_KEY 值复制而来。

[编辑] 在 ValidateIdentity 中使用源和异常进行调试

AppServiceAuthenticationHandler.ValidateIdentity

已下载源 v1.1.157.1,从符号源加载符号但标记为 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 包的重大更改有关 - 从 System.IdentityModel.TokensJwt 包的 v4 -> v5。

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

我将我的安装降级到 v4.0.x,它修复了异常,还修复了我在本地运行时看到的 401 错误。

现在一切都很好

最佳答案

您的 web.config 中的 authSigningKeyauthAudienceauthIssuer 应用设置是否正确?

仅供引用 - 如果您还没有偶然发现它,这里有一篇关于设置的好文章:http://www.systemsabuse.com/2015/12/04/local-debugging-with-user-authentication-of-an-azure-mobile-app-service/

关于azure-mobile-services - 在 Azure 中进行身份验证但在本地主机上调用 Web API - 401,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38569475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com