gpt4 book ai didi

azure - Multi-Tenancy Azure 移动应用服务调用失败并显示 401.71

转载 作者:行者123 更新时间:2023-12-02 02:10:23 25 4
gpt4 key购买 nike

首先,我是 Azure 编程和 Azure AD 身份验证的新手,我一直在遵循在各个站点(包括 MS)找到的教程来帮助我走到这一步。我使用的是 Xcode v7.2、ADAL for iOS v1.2.4、Visual Studio 2015 Update 1 和 Azure 应用服务工具 v2.8.1。

我有一个现有的 native iOS 应用程序,我需要能够通过该应用程序对多个 Azure Active Directory 实例用户进行身份验证。这些用户分为内部用户和外部用户(注册我们服务的客户)。为此,我实验性地实现了以下高级架构:

native 客户端应用程序 (iOS/obj-c) -> ADAL iOS 库 -> (Azure AD 身份验证) -> Azure 移动应用程序(服务层)

iOS 应用程序利用 ADAL iOS 库获取访问 token ,用于调用 Azure 移动应用程序项目中的授权 Web API 服务。

我能够对来自两个租户(内部 Azure AD 和外部 Azure AD)的用户进行身份验证,但只有与服务(内部)位于同一租户中的用户才能调用经过身份验证的 API。我从外部租户使用的测试用户帐户被设置为全局管理员,并且在进行身份验证时,我会在 native 应用程序中看到适当的同意 View 。然后我可以点击同意并收到访问 token 。然而,当使用该 token 调用测试 API 时,我收到了 401 响应。服务器上 Azure 移动应用程序的详细日志显示以下消息(下面的所有 URL 均为 https,我只是没有代表将其发布为此类):

2016-01-12T13:00:55  PID[7972] Verbose     Received request: GET MyAzureMobileApp.azurewebsites.net/api/values
2016-01-12T13:00:55 PID[7972] Verbose Downloading OpenID configuration from sts.windows.net/<internal AD GUID>/.well-known/openid-configuration
2016-01-12T13:00:55 PID[7972] Verbose Downloading OpenID issuer keys from login.windows.net/common/discovery/keys
2016-01-12T13:00:56 PID[7972] Warning JWT validation failed: IDX10205: Issuer validation failed. Issuer: 'sts.windows.net/<external AD GUID>/'. Did not match: validationParameters.ValidIssuer: 'sts.windows.net/<internal ad guid>/' or validationParameters.ValidIssuers: 'null'..
2016-01-12T13:00:56 PID[7972] Information Sending response: 401.71 Unauthorized

我在几篇文章中读到,您可以通过将 TokenValidationParameters 中的 ValidateIssuer 参数设置为 false 来禁用服务中的 token 颁发者验证。我尝试过这样做,但似乎没有任何效果。以下是我的 Azure 移动应用项目的代码:

启动代码:

// Startup.cs
using Microsoft.Owin;
using Owin;

[assembly: OwinStartup(typeof(MyAzureMobileApp.Startup))]
namespace MyAzureMobileApp
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
ConfigureMobileApp(app);
ConfigureAuth(app);
}
}
}

MobileApp 的代码 - 这应该是库存的,由 Azure 移动应用项目模板生成:

// Startup.MobileApp.cs  
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data.Entity;
using System.Web.Http;
using Microsoft.Azure.Mobile.Server;
using Microsoft.Azure.Mobile.Server.Authentication;
using Microsoft.Azure.Mobile.Server.Config;
using MyAzureMobileApp.DataObjects;
using MyAzureMobileApp.Models;
using Owin;

namespace MyAzureMobileApp
{
public partial class Startup
{
public static void ConfigureMobileApp(IAppBuilder app)
{
HttpConfiguration config = new HttpConfiguration();

new MobileAppConfiguration()
.UseDefaultConfiguration()
.ApplyTo(config);

// Use Entity Framework Code First to create database tables based on your DbContext
Database.SetInitializer(new MobileServiceInitializer());

MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();

if (string.IsNullOrEmpty(settings.HostName))
{
app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
{
// This middleware is intended to be used locally for debugging. By default, HostName will
// only have a value when running in an App Service application.
SigningKey = ConfigurationManager.AppSettings["SigningKey"],
ValidAudiences = new[] { ConfigurationManager.AppSettings["ValidAudience"] },
ValidIssuers = new[] { ConfigurationManager.AppSettings["ValidIssuer"] },
TokenHandler = config.GetAppServiceTokenHandler()
});
}

app.UseWebApi(config);
}
}

public class MobileServiceInitializer : CreateDatabaseIfNotExists<MobileServiceContext>
{
protected override void Seed(MobileServiceContext context)
{
List<TodoItem> todoItems = new List<TodoItem>
{
new TodoItem { Id = Guid.NewGuid().ToString(), Text = "First item", Complete = false },
new TodoItem { Id = Guid.NewGuid().ToString(), Text = "Second item", Complete = false }
};

foreach (TodoItem todoItem in todoItems)
{
context.Set<TodoItem>().Add(todoItem);
}

base.Seed(context);
}
}
}

认证启动代码:

// Startup.Auth.cs
using System;
using System.Collections.Generic;
using System.Configuration;
using System.IdentityModel.Tokens;
using System.Linq;
using Microsoft.Owin.Security;
using Microsoft.Owin.Security.ActiveDirectory;
using Owin;

namespace MyAzureMobileApp
{
public partial class Startup
{
// For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
public void ConfigureAuth(IAppBuilder app)
{
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
AuthenticationMode = AuthenticationMode.Active,
TokenValidationParameters = new TokenValidationParameters()
{
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"],
ValidateIssuer = false
}
});

}
}
}

服务实现:

using System.Web.Http;
using Microsoft.Azure.Mobile.Server.Config;

namespace MyAzureMobileApp.Controllers
{
// Use the MobileAppController attribute for each ApiController you want to use
// from your mobile clients
[MobileAppController]
// Use the MobileAppController attribute for each ApiController you want to use
// from your mobile clients
[Authorize]
public class ValuesController : ApiController
{
// GET api/values
public string Get()
{
return "GET returned: Hello World!";
}

// POST api/values
public string Post()
{
return "POST returned: Hello World!";
}
}
}

以及 web.config 中我的 appSettings 部分:

  <appSettings>
<add key="PreserveLoginUrl" value="true" />
<!-- Use these settings for local development. After publishing to your
Mobile App, these settings will be overridden by the values specified
in the portal. -->
<add key="MS_SigningKey" value="Overridden by portal settings" />
<add key="EMA_RuntimeUrl" value="Overridden by portal settings" />
<!-- When using this setting, be sure to add matching Notification Hubs connection
string in the connectionStrings section with the name "MS_NotificationHubConnectionString". -->
<add key="MS_NotificationHubName" value="Overridden by portal settings" />
<add key="ida:ClientId" value="-- MyAzureMobileApp App ID from Azure AD --" />
<add key="ida:Tenant" value="InternalTestAD.onmicrosoft.com" />
<add key="ida:Audience" value="https://InternalTestAD.onmicrosoft.com/MyAzureMobileApp" />
<add key="ida:Password" value="-- password value removed --" />
</appSettings>

除了作为 WindowsAzureActiveDirectoryBearerAuthenticationOptionsTokenValidationParameters 集合的属性之外,我没有看到指定有效 token 颁发者的地方。

根据我对代码的理解,我应该禁用颁发者验证,但我尝试在此处添加外部 Azure AD STS URL。不幸的是,它似乎没有任何效果。

有人知道这段代码是否因某种原因被忽略或覆盖吗?我是否错过了一些其他设置来完全禁用发行人验证或指定有效发行人的列表?

我当然可以根据要求提供更多信息,我只是不确定还有哪些相关信息。

谢谢!

最佳答案

我相信我已经找到了我的验证逻辑被忽略的原因。在 Azure 应用服务中设置我的 Web api 站点时,我通过填充“身份验证/授权”>“Azure Active Directory 设置”边栏选项卡中的颁发者 URL 文本框来指定主租户颁发者 URL。事实证明,当您将拥有多个发行人(如在我的 Multi-Tenancy 场景中)时,您应该将此字段留空

JWT 将根据您在该文本框中提供的颁发者进行验证,这是完全有道理的。对我来说不太直观的是,当您有多个发行人时,您应该将其留空。也许微软可以将其添加到其上方的信息气泡中?或者提供某种允许多个发行者 URL 的机制。

希望这可以节省其他人处理此问题的时间。

关于azure - Multi-Tenancy Azure 移动应用服务调用失败并显示 401.71,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34748339/

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