Azure AD Graph API-将用户添加到应用程序将获得PlatformNotSupportedException

时间:2019-03-20 13:45:29

标签: c# azure-active-directory azure-ad-graph-api

我的目标是将用户添加到Azure中的应用程序。

我仅将旧的Azure AD Graph API用于此方法,因为较新的Microsoft Graph API当前不支持此功能。

通过消除过程,我发现错误是在尝试通过id获取用户时刚开始时发生的。

我得到的错误是;

System.InvalidOperationException: An error occurred while processing this request. ---> System.PlatformNotSupportedException: Secure binary serialization is not supported on this platform.

我的方法代码;

public async Task AddUserToService(string userId)
{
    try
    {
        var user = await activeDirectoryClient.Users.GetByObjectId(userId).ExecuteAsync() as User;

        var appRoleAssignment = new AppRoleAssignment()
        {
            ResourceId = Guid.Parse(applicationId),
            PrincipalId = Guid.Parse(userId),
            Id = Guid.Parse(roleId)
        };

        user.AppRoleAssignments.Add(appRoleAssignment);
        await user.UpdateAsync();
    } catch (Exception e)
    {
        _logger.Log(Microsoft.Extensions.Logging.LogLevel.Error, "Error occurred during retrieval; " + e);
    }
}

1 个答案:

答案 0 :(得分:0)

我对旧图使用直接休息的httpClient调用。

我仅将其发布为参考-请注意网址(1.6)上的显式版本。我还将发布反序列化的对象,这可能与官方对象架构不匹配。

// OLD Graph End point    //  like ... https://graph.windows.net/{tenant-id}/users/{id}/appRoleAssignments?api-version=1.6
   urlUserInviteToUse = "https://graph.windows.net/" + m_CfgHlp.TenIdInB2C + "/" + ObjFamilyName + "/" + DirObjIdToGet + "/" + ObjFunctionCall + "?api-version=1.6";

由于其余的api字符串有效负载,我有效地使用了JsonConvert.DeserializeObject从有效负载转到对象类。请注意,日期不会反序列化为日期。

public class AppRoleAssignmentsRoot
{
    public string odatametadata { get; set; }
    public AppRoleAssignment[] value { get; set; }
}

public class AppRoleAssignment
{
    public string odatatype { get; set; }
    public string objectType { get; set; }
    public string objectId { get; set; }
    public object deletionTimestamp { get; set; }
    public object creationTimestamp { get; set; }
    public string id { get; set; }
    public string principalDisplayName { get; set; }
    public string principalId { get; set; }
    public string principalType { get; set; }
    public string resourceDisplayName { get; set; }
    public string resourceId { get; set; }
}

希望有帮助。