我想向管理员通过图形 API 管理的某些特定用户的令牌添加自定义声明。
基本场景如下:
用户已注册我的应用程序。最初,所有用户对资源的访问权限都是有限的。作为管理员,我将通过添加特定声明来更新一些用户,以便我的应用程序将授权用户使用特定资源。
在我的理解中,有几种方法可以在令牌中包含声明(扩展属性)。
通过 azure 门户创建用户属性,并在注册策略中使用它来收集用户的值。就我而言,自定义属性将仅由管理员应用,因此我不会让用户管理此声明。所以这对我来说不是一个好方法,对我来说也没有意义,因为我会在许多用户已经注册后添加新属性,所以将无法收集这些信息。
另一种方式是通过Graph Api添加扩展属性。要完成它,我需要创建一个新应用程序(通过应用程序注册)并通过图形 API 向该应用程序注册扩展属性。然后通过在该应用程序中添加新创建的扩展属性来更新用户(通过图形 API)。最后,我希望这个扩展属性会出现在我的令牌中,但没有机会。它在门户网站、令牌中不可见,但仅在图形 API 响应中可见。
创建我不会的自定义策略,因为不建议非专家使用。
我在第二个解决方案中缺少什么?
我们在 .NET Core 2.1上运行,在运行以下查询时有时会出现异常“此平台不支持安全二进制序列化”:
await _adClient.Users[userId].AppRoleAssignments.ExecuteAsync();
Run Code Online (Sandbox Code Playgroud)
重新执行查询通常有效,因此满足某些条件,即在后续请求中未尝试(或成功?)二进制序列化?也就是说,如果我重新启动服务,它通常也会对第一个请求起作用。
我们正在使用旧的 AD Graph 客户端,因为 1) Microsoft Graph 客户端尚不完全支持AppRoleAssignments,2) 支持的内容是测试版的一部分,不建议用于生产用途。
完整的调用堆栈如下:
System.Data.Services.Client.BaseAsyncResult.EndExecute<T>(object source, string method, IAsyncResult asyncResult)
System.Data.Services.Client.QueryResult.EndExecuteQuery<TElement>(object source, string method, IAsyncResult asyncResult)
System.Data.Services.Client.DataServiceRequest.EndExecute<TElement>(object source, DataServiceContext context, string method, IAsyncResult asyncResult)
System.Data.Services.Client.DataServiceQuery<TElement>.EndExecute(IAsyncResult asyncResult)
Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper+<>c__DisplayClass4c<TSource, TInterface>.<ExecuteAsync>b__4a(IAsyncResult r)
System.Threading.Tasks.TaskFactory<TResult>.FromAsyncCoreLogic(IAsyncResult iar, Func<IAsyncResult, TResult> endFunction, Action<IAsyncResult> endAction, Task<TResult> promise, bool requiresSynchronization)
Microsoft.Azure.ActiveDirectory.GraphClient.Extensions.DataServiceContextWrapper.ExecuteAsync<TSource, TInterface>(DataServiceQuery<TSource> inner)
Microsoft.Azure.ActiveDirectory.GraphClient.AppRoleAssignmentCollection.<ExecuteAsync>b__2()
Merck.SeaMonkey.Api.AzureADApi.Controllers.UserController.GetApplicationRoleAssignments(string userId) in UserController.cs
Run Code Online (Sandbox Code Playgroud)
新的 Microsoft Graph 客户端不是这里的一个选项,尽管我想我们可以下拉到基本 REST 接口,这对我们依赖于图客户端的所有重试逻辑、结果解析等有点工作去做。
更新:给出异常的来源,我们假设在序列化 OData 响应中的实体时存在问题。但是,使用 AD Graph Explorer,我们会看到一个非常简单的响应,即空值数组以及指向实体元数据文档的链接。我们通过删除和添加新的应用程序角色分配使问题经常再次发生,但我们不能强制它 100% 可靠地发生。看起来某些状态正在损坏,也许在某些内部缓存中?
c# azure-ad-graph-api asp.net-core microsoft-graph-sdks microsoft-graph-api
我正在尝试使用图形 API 获取多租户应用程序的所有用户。为此,我使用请求生成了访问令牌:
POST https://login.microsoftonline.com/common/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com
Content-Type: application/x-www-form-urlencoded
client_id=535fb089-9ff3-47b6-9bfb-4f1264799865
&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default
&client_secret=qWgdYAmab0YSkuL1qKv5bPX
&grant_type=client_credentials
Run Code Online (Sandbox Code Playgroud)
注意:请注意,在上述请求中,我使用common代替{tenantID}. 这只是一次点击和尝试,就像文档中为 adminConsent 建议的那样。
通过使用上面生成的访问令牌,我请求用户 API 并收到以下错误
{
"error": {
"code": "Authorization_IdentityNotFound",
"message": "The identity of the calling application could not be established.",
"innerError": {
"request-id": "56141b7d-dd5e-44b1-9395-cd15d02b52de",
"date": "2019-06-17T12:42:19"
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用租户 ID 生成令牌时,它仅返回一个活动目录的用户。
谁能建议我哪里出错了?
active-directory azure multi-tenant onedrive azure-ad-graph-api
我正在使用 MSAL 使用集成 Windows 身份验证从 Azure 中的身份验证应用程序获取令牌。代码是:
var tenant = $"https://login.microsoftonline.com/<myTenantId>";
var clientId = "<myClientId>";
var scopes = new string[] { "https://graph.microsoft.com/.default" };
var publicApplication = PublicClientApplicationBuilder.Create(clientId).WithAuthority(tenant).Build();
var token = await publicApplication.AcquireTokenByIntegratedWindowsAuth(scopes).ExecuteAsync();
Run Code Online (Sandbox Code Playgroud)
这会引发以下异常:
Integrated Windows Auth is not supported for managed users.
Run Code Online (Sandbox Code Playgroud)
我已按照https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Integrated-Windows-Authentication中的步骤进行操作,据我所知,我没有错过任何内容。
我的配置中是否遗漏了某些内容?对此的任何帮助都将受到高度赞赏。
azure azure-active-directory azure-ad-graph-api azure-ad-msal azure-authentication
如何从 asp net core mvc 应用程序中的 Azure AD B2C 获取用户列表?
我正在尝试对我的 Azure B2C Active Directory 用户执行查询。
到目前为止,使用以下查询一切正常:
https://graph.windows.net/myTentant/users?$filter=
startswith(displayName,'test')%20
or%20startswith(givenName,'test')%20
or%20startswith(surname,'test')%20
or%20startswith(mail,'test')%20
or%20startswith(userPrincipalName,'test')
&api-version=1.6
Run Code Online (Sandbox Code Playgroud)
问题是,这些属性只是简单的值,如下所示:
"displayName: "testValue",
"givenName": "testValue",
"displayName: "testValue",
"surname": "testValue",
"mail: "testValue",
"userPrincipalName": "testValue",
Run Code Online (Sandbox Code Playgroud)
就我而言,我需要再使用一个语句,其中我需要检查一个数组是否像其他数组一样包含“test”。这个数组看起来像这样:
"signInNames": [
{
"type": "emailAddress",
"value": "test@mail.com"
}, {
"type": "emailAddress",
"value": "test2@mail.com"
}
]
Run Code Online (Sandbox Code Playgroud)
我已经在官方文档中搜索但没有运气......有什么想法吗?
azure azure-active-directory azure-ad-graph-api azure-ad-b2c
我正在开发一个小 WPF 应用程序,该应用程序应该从 MS Graph API 查询一些数据。我想使用 SSO,这样用户就不必单独登录应用程序。
该应用程序在加入 Azure AD 的设备上运行。该用户是AADC同步的AD用户。AAD 租户与 ADFS 联合。用户使用 Hello for Business (PIN) 或密码进行身份验证。由此产生的问题是相同的。
我可以确认用户通过以下方式获得了 PRT:
dsregcmd /status
AzureAdPrt: YES
Run Code Online (Sandbox Code Playgroud)
如果重要的话:Azure AD 中的应用程序注册设置为“将应用程序视为公共客户端”。并配置以下重定向 URI:
根据我找到的示例,我使用以下代码来尝试获取访问令牌。但是该GetAccountsAsync()方法不会返回任何用户,也不会引发任何错误或异常。
谁能告诉我,我在这里缺少什么?
任何帮助将非常感激!
PS:当我使用“交互式身份验证”尝试此操作时,效果很好。
public GraphAuthProvider(string appId, string tenantId, string[] scopes)
{
_scopes = scopes;
try
{
_msalClient = PublicClientApplicationBuilder
.Create(appId)
.WithAuthority(AadAuthorityAudience.AzureAdMyOrg, true)
.WithTenantId(tenantId)
.Build();
}
catch (Exception exception)
{
_log.Error(exception.Message);
_log.Error(exception.StackTrace);
throw;
}
}
public async Task<string> GetAccessToken()
{
_log.Info("Starting 'GetAccessToken'...");
var accounts …Run Code Online (Sandbox Code Playgroud) c# single-sign-on azure-active-directory azure-ad-graph-api azure-ad-msal
我能够将另一个租户创建的应用程序注册为我自己租户的企业应用程序。我以用户身份登录该应用程序,但收到以下错误。
AADSTS50020:来自身份提供商“https://sts.windows.net/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee/”的用户帐户“test001@testdomain001.onmicrosoft.com”在租户“testdomain002”中不存在,并且无法访问该租户中的应用程序“55555555-6666-7777-8888-999999999999”(OneDriveAPIBrowser_test001)。需要先将该帐户添加为租户中的外部用户。注销并使用不同的 Azure Active Directory 用户帐户再次登录。
在应用程序创建者租户不执行任何处理的情况下,另一个租户的用户如何使用它?
我正在从 Azure AD Graph API 迁移到 Microsoft Graph,因为它现已弃用。以前可以使用Microsoft.Azure.ActiveDirectory.GraphClient .GetExtendedProperties();调用来访问用户的扩展属性,例如:
var client = new ActiveDirectoryClient(serviceRoot, async () => await GetToken());
var user = await client.Users["user id..."].ExecuteAsync();
var properties = user.GetExtendedProperties();
Run Code Online (Sandbox Code Playgroud)
我需要使用 中的等效调用来复制此内容Microsoft Graph。
我查看了schemaExtensions端点,例如:
获取所有扩展名:
/v1.0/schemaExtensions
但这似乎不会返回与 AD Graph 客户端相同的扩展数据。
使用 ext 获取用户:
v1.0/users/[user id]?$expand=extensions&$select=id,extension_[application id]_myExtension,onPremisesExtensionAttributes,displayName,jobTitle,identities
哪里extension_[application id]_myExtension有格式示例扩展:
extension_appid_extensionname
并且这不会返回用户的自定义扩展数据(但是其他属性工作正常)。
我们如何将扩展属性从 AD Graph 客户端迁移到 Microsoft Graph?
c# azure azure-active-directory azure-ad-graph-api microsoft-graph-api
我们创建了内置的密码重置用户流程。
我们使用 Microsoft Graph API 在 B2C 中自动注册用户,并发送一封电子邮件,其中包含密码重置流程的直接链接,以便他们在首次登录时重置密码。
用户正确完成密码重置用户流程,并将其重定向回我们的应用程序,该应用程序将用户重定向到我们的SignIn自定义策略用户旅程!
我们有 Home Realm Discovery,用户首先会看到一个屏幕来输入他们的电子邮件地址,单击“下一步”,然后输入密码。
输入电子邮件地址并单击“下一步”后,我们收到以下错误:
Sorry, but we're having trouble signing you in.
We track these errors automatically, but if the problem persists feel free to contact us. In the meantime, please try again.
Correlation ID: d5a7e1ed-a6d2-4b6d-bc87-b8612a5419b4
Timestamp: 2021-05-27 12:19:05Z
AADB2C: An exception has occurred.
Run Code Online (Sandbox Code Playgroud)
这是 UserJourney 和 SubJourney:
<UserJourneys>
<UserJourney Id="HRDSignUpSignInMFAEmebeddedPasswordReset">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="ParseDomainHint" TechnicalProfileReferenceId="ParseDomainHint" />
</ClaimsExchanges>
</OrchestrationStep>
<!-- api.hrd reference to custom login …Run Code Online (Sandbox Code Playgroud) change-password azure-ad-graph-api azure-ad-b2c microsoft-graph-api aad-b2c