c# - Azure Active Directory 用户原理上下文服务器名称

标签 c# azure azure-active-directory

我正在尝试获取我的 azure 网站的上下文以获取用户详细信息。当尝试获取服务器名称(第二个参数)的上下文时,我的代码此时失败了。在这种情况下,我可以在哪里从 azure 中提取服务器名称。我从here找到了一些信息.

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "mysitename.azurewebsites.net"))

完整代码示例

static GroupPrincipal[] GetUserAuthorisationGroups(string userPrincipalName)
{
    using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "mysitename.azurewebsites.net"))
        using (UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.UserPrincipalName, userPrincipalName))
        {
            return user.GetAuthorizationGroups().OfType<GroupPrincipal>().ToArray();
        }
    }
}

最佳答案

我将笼统且更具体地回答您想要实现的目标。

首先 - Azure AD 和 Windows Server AD 不是同一件事。它们都旨在解决相同的问题,但解决问题的方式却截然不同(正如所预料的那样 - 像云这样不受信任的非域环境具有显着不同的可用基础设施)。

更复杂的是,Windows Server AD 可以同步到 Azure AD,但只能同步对象信息(例如用户、组等),以便这些信息在 Azure AD 中可用。但是协议(protocol)级别的东西(例如 Kerberos)无法通过 Azure AD 获得(好吧,除了通过 Azure AD 域服务之类的东西,但这更多地适用于旧方案,并且不适用于托管 Web 应用程序的 Azure 应用程序服务)。

无论如何 - 因此,Azure AD 不是拥有可以使用 Kerberos 与 Windows Server AD 通信的受信任的加入域的服务器,而是依赖于 OAuth 和更现代的协议(protocol),这些协议(protocol)可以在 Web 上工作,并且不需要受信任的服务器。无论托管服务器如何,受 OAuth 保护的 Web 应用程序或移动应用程序都可以运行。您可以在此处阅读有关 AAD 的更多信息:https://msdn.microsoft.com/en-us/library/azure/jj573650.aspx

您似乎正在尝试获取用户组以进行授权决策,并且您正在 Azure 应用服务中工作。您需要做两件事:

  • 向 Azure AD 进行身份验证,并且
  • 从 Azure AD 获取其他授权信息

身份验证相当简单。由于您使用的是 C#,因此大部分操作都可以通过 ADAL 库完成,该库为您抽象了大部分复杂性。您可以在此处的 Azure GitHub 示例中找到示例:

这些步骤的目的是 - 将应用程序注册添加到Azure AD - 这将为您提供一个客户端 ID(以及可选的 secret ,您稍后将需要它),用于在 Azure AD 中唯一标识您的应用程序 - 将 ADAL NuGet 包添加到您的应用程序 - 让 ADAL 将用户重定向到 Azure AD 进行登录 - 登录后消耗 token 并将用户登录到您的应用程序

您可以在此处找到完整的示例:https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect

此示例将帮助您完成应用注册和配置 ADAL 以将用户登录到您的应用。这至少会让您通过身份验证,这样您就会知道您的用户是谁。

您接下来要做的事情是 - 包括 Azure AD 应用程序角色,该角色将包含在声明集中。您可以使用这些来做出授权决策(例如[Authorize(Role=SomeRoleName)],类似于使用本地 AD 组的方式),或者 - 查询 Azure AD 或 Microsoft Graph API 以获取其他用户信息,例如组成员身份或其他用户属性。

所有用户信息都存储在图表中,因此您可以通过 PrincipalSearcher 查询其中的用户信息,而不是查询本地 AD。

以下是使用 Azure AD 应用程序角色的示例:https://github.com/Azure-Samples/active-directory-dotnet-webapp-roleclaims

另一个使用组声明(例如,在返回的声明集中包含组 GUID):https://github.com/Azure-Samples/active-directory-dotnet-webapp-groupclaims

最后,这是另一个示例,它查询 AAD 图表以将组 GUID 解析为组名称,这对于迁移通过组检查授权的现有 Windows AD 代码非常有用:https://github.com/jpda/azure-ad-netcore-sample

希望有帮助。

关于c# - Azure Active Directory 用户原理上下文服务器名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42588666/

相关文章:

azure - Windows Azure 网站磁盘空间

azure - 如何在 Cosmos DB 中查找逻辑分区数量和大小

.net - 云上的非 ASP.NET

c# - 即使管理员已同意,也会触发 ADAL 用户同意

node.js - GET https ://graph. microsoft.com/v1.0/me 返回 401(未经授权),前提是具有 User.Read 权限的有效访问 token

c# - Azure Key Vault "Reference Syntax"不执行任何操作

c# - 列 ID 在规范中出现多次?

Azure 媒体服务 v3 与 Azure Function 不兼容

c# - 不能将 long 类型转换为 T,这里 T 是一个 Enum 的值

C# 为什么我的文件路径出现 NotSupported 异常