C# Azure Active Directory用户(类型=具有现有用户帐户的用户)Json-to-List模型为空

C# Azure Active Directory用户(类型=具有现有用户帐户的用户)Json-to-List模型为空,c#,json,azure,single-sign-on,azure-active-directory,C#,Json,Azure,Single Sign On,Azure Active Directory,我想将Json结果反序列化到一个模型中。 我正在使用Azure单点登录方法。当我在ad中使用新创建的用户(您组织中的新用户)登录时,我会获得正确的用户信息。但是,如果我在AzureAd中创建了一个新用户,并使用“具有现有用户帐户的用户”,我就可以登录,并且请求也可以通过身份验证。但我没有得到用户资料。用户配置文件为空。但“responseString”包含用户的所有值。有人能帮我吗 UserProfile profile = JsonConvert.DeserializeObject<Us

我想将Json结果反序列化到一个模型中。 我正在使用Azure单点登录方法。当我在ad中使用新创建的用户(您组织中的新用户)登录时,我会获得正确的用户信息。但是,如果我在AzureAd中创建了一个新用户,并使用“具有现有用户帐户的用户”,我就可以登录,并且请求也可以通过身份验证。但我没有得到用户资料。用户配置文件为空。但“responseString”包含用户的所有值。有人能帮我吗

UserProfile profile = JsonConvert.DeserializeObject<UserProfile>(responseString);

public class UserProfile
{
    public string DisplayName { get; set; }
    public string GivenName { get; set; }
    public string Surname { get; set; }
}

实际上,您会得到不同的JSON。我简化了它们以显示问题。对于新用户,JSON如下所示:

{  
  "odata.metadata":"...Microsoft.WindowsAzure.ActiveDirectory.User/@Element",
  "odata.type":"Microsoft.WindowsAzure.ActiveDirectory.User", 
  "displayName":"mahesh", 
  "givenName":"mahesh", 
  "surname":null  
} 
反序列化将适用于您的模型。但对于现有用户,JSON是:

{  
  "odata.metadata":"...Microsoft.WindowsAzure.ActiveDirectory.User",
  "value":[  
    {  
      "odata.type":"Microsoft.WindowsAzure.ActiveDirectory.User",     
      "displayName":"mahesh",      
      "givenName":"map",     
      "surname":"map"     
    },
    {  },
    {  }
  ]
}
如您所见,您有一个
属性,该属性包含一个用户数组。因此,为了能够对其进行反序列化,您需要创建新模型:

public class RootObject
{
    public List<UserProfile> Value { get; set; }
}
公共类根对象
{
公共列表值{get;set;}
}
然后:

var obj = JsonConvert.DeserializeObject<RootObject>(json);
var obj=JsonConvert.DeserializeObject(json);
我与Azure Active Directory不相似,但您应该检查为什么odata.metadata属性对于这些响应是不同的。

我得到了敬礼:)

在global.asax中添加此块

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
    ClaimsIdentity id = ((ClaimsIdentity)User.Identity);
    Claim claim = id.FindFirst(ClaimTypes.Email);
    if (claim != null)
    {
        string email = claim.Value;
        id.AddClaim(new Claim(ClaimTypes.Name, email));
    }
} 

请为这两种情况提供
responseString
示例。我已使用responseString@Aleksandr Ivanov进行了更新
protected void Application_PostAuthenticateRequest(Object sender, EventArgs e)
{
    ClaimsIdentity id = ((ClaimsIdentity)User.Identity);
    Claim claim = id.FindFirst(ClaimTypes.Email);
    if (claim != null)
    {
        string email = claim.Value;
        id.AddClaim(new Claim(ClaimTypes.Name, email));
    }
}