Десериализовать объект json после аутентификации в webapi - PullRequest
0 голосов
/ 06 ноября 2018

Я отправляю запрос на публикацию в webapi 2.0 "www.someurl.com \ token" следующим образом -

"username": "someone@gmail.com", "password": "somepassword", "grant_type" : "password"

Если webapi может аутентифицироваться, он отправляет мне токен на предъявителя с этими полями -

"{\"access_token\":\"...the token...\",\"token_type\":\"bearer\",\"expires_in\":1209599,\"userName\":\"someone@gmail.com\",\".issued\":\"Mon, 05 Nov 2018 13:59:10 GMT\",\".expires\":\"Mon, 19 Nov 2018 13:59:10 GMT\"}"

Мне было интересно, могу ли я десериализовать его в объект класса напрямую, что-то может быть похоже на это Json.Convert<Object Type>(data). Я всегда могу использовать собственный объект для этого, но я ищу, могу ли я использовать какой-нибудь стандартный тип класса.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Нет встроенной библиотеки .NET для OAuth. Обычно поставщики удостоверений (IDP) предоставляют эти строго типизированные библиотеки.

Например, Azure AD предоставляет Microsoft.IdentityModel.Protocols.OpenIdConnect .

namespace Microsoft.IdentityModel.Protocols.OpenIdConnect
{  
  public class OpenIdConnectMessage : AuthenticationProtocolMessage
  {
    /// <summary>
    /// Gets or sets 'access_Token'.
    /// </summary>
    public string AccessToken ...

    /// <summary>
    /// Gets or sets 'token_type'.
    /// </summary>
    public string TokenType ...

     /// <summary>
     /// Gets or sets 'expires_in'.
     /// </summary>
     public string ExpiresIn ...
  }
}
0 голосов
/ 06 ноября 2018

Вы должны спросить себя, для чего вы хотите использовать этот объект? Простая десериализация объекта будет означать, что вы не получите доступ ни к одному из свойств без использования отражения, которое в лучшем случае будет грязным. Вместо этого объявите класс:

public sealed class BearerToken
{
    [JsonProperty(PropertyName = "access_token")]
    public string AccessToken { get; set; }

    [JsonProperty(PropertyName = "token_type")]
    public string TokenType { get; set; }

    [JsonProperty(PropertyName = "expires_in")]
    public int ExpiresInMilliseconds { get; set; }

    [JsonProperty(PropertyName = "userName")]
    public string Username { get; set; }

    [JsonProperty(PropertyName = ".issued")]
    public DateTimeOffset? IssuedOn { get; set; }

    [JsonProperty(PropertyName = ".expires")]
    public DateTimeOffset? ExpiresOn { get; set; }
}

Тогда вы можете просто сделать JsonConvert.DeserializeObject<BearerToken>(data);, что даст вам полностью сформированный BearerToken объект, который вы затем сможете использовать.

Обратите внимание, что магия здесь заключается в атрибуте JsonProperty, который сообщит конвертеру, в какое поле и куда идти. Вы также можете использовать такие инструменты, как this для автоматической генерации классов для вас.

0 голосов
/ 06 ноября 2018

Да, вы можете сделать это, объявив переменную, которую вы пытаетесь десериализовать, в dynamic

Попробуйте это:

dynamic value = JsonConvert.DeserializeObject<Object>("");

Вам понадобится пакет Newtonsoft.Json Nuget

Теперь вы можете получить доступ к значениям просто:

Console.Writeline(value.username);

Редактировать: Это, вероятно, не будет работать, потому что есть свойства, которые начинаются с '.'

...