Как заставить JWT работать в SDK, созданном Autorest? (ASP.NET Core 2.0)

Я хочу иметь возможность войти в свою базу данных идентификации с именем пользователя и паролем и получить JWT. Затем я хочу использовать JWT для безопасного доступа к данным из моего API.

Я обнаружил, что код SDK, сгенерированный VS2017, использует старую версию автореста, поэтому я переключился на использование Azure Autorest

И api, и SDK - это ASP.NET Core 2.0.

Для создания SDK я использую

AutoRest -mynamespace mytrack.Client -CodeGenerator CSharp -Modeler 
Swagger -Input swagger.json -PackageName mytrack.client -AddCredentials true

Версии отображаются как

AutoRest code generation utility [version: 2.0.4262; node: v8.11.2]

Я написал свой тест как

using System;
using System.Threading.Tasks;
using Microsoft.Rest;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json.Linq;
using swagger; // my name space from the autorest command, not to be confused with swagger itself.
using swagger.Models;

namespace CoreClientTest
{
    [TestClass]
    public class MyTests
    {
        [TestMethod]
        public void TestMethod1()
        {
            try
            {
                GetMyJob().Wait();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static async Task GetMyJob()
        {
            var tokenRequest = new TokenRequest
            {
                Username = "myusername",
                Password = "mypassword"
            };

            var credentials = new TokenCredentials("bearer token");
            var uri = new Uri("https://localhost:44348", UriKind.Absolute);
            var tokenClient = new Track3API(uri, credentials);
            var tokenResponse = await tokenClient.ApiRequestTokenPostWithHttpMessagesAsync(tokenRequest);
            var tokenContent = await tokenResponse.Response.Content.ReadAsStringAsync();
            var tokenString = JObject.Parse(tokenContent).GetValue("token").ToString();
            var creds2 = new TokenCredentials(tokenString);
            var client2 = new Track3API(uri, creds2);
            var result = await client2.ApiJobsByIdGetWithHttpMessagesAsync(1);
            var response = result.Response;
            Console.WriteLine(response.ToString());
        }
    }
}

Я вижу, что результат ОК, и я вижу в нем токен. Я не вижу работу по возвращению

Метод в api имеет

[Produces("application/json")]
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
[Route("api/jobs")]
public class JobController : Controller
{


/// <summary>
/// Returns Job Header for Id
/// </summary>
/// <param name = "id"></param>
/// <returns></returns>
[HttpGet("{id}", Name = "Get")]
public IActionResult Get(int id)
{
    var header1 = new JobHeader
    {
        JobNumber = "1234",
        Id = id,
        CustomerPurchaseOrderNumber = "fred"
    };
    return Ok(header1);
}

}

Вы должны применить атрибут DataContract к классу, чтобы, когда RestClient использует ссылку на службу, он также генерировал типы. Прочтите здесь - docs.microsoft.com/en-us/dotnet/api/…

user1672994 19.05.2018 08:27

Вы используете Web API 2? Или это ASP.NET Core MVC?

Federico Dipuma 19.05.2018 12:35

Также добавьте трассировку стека ошибок, которая должна помочь людям лучше разобраться в проблеме.

Tarun Lalwani 21.05.2018 09:29

чтение dzimchuk.net/generating-clients-for-your-apis-with-autorest

Kirsten Greed 29.05.2018 08:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
1 027
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны применить атрибут DataContract к классу, чтобы, когда RestClient использует ссылку на службу, он также генерировал типы.

Прочтите это здесь.

Вы также должны прикрепить атрибут DatamMember к Свойству. См. Пример ниже

[DataContract]
class Person 
{
    [DataMember]
    public string Name {get; set; }

    [DataMember]
    public int Id {get; set; }

    public Person(string name, int id)
    {
        this.Name = name;
        this.Id = id;
    }
}

Когда клиент Rest использует службу, он будет генерировать классы на стороне клиента для тех классов, которым присвоен DataContract.

Я попробовал это, но не увидел никакой разницы в сгенерированной модели (извините за большое переписывание вопроса)

Kirsten Greed 20.05.2018 00:54
Ответ принят как подходящий

Наконец-то он заработал. Я нашел подсказку на Блог Андрея Дзимчука по настройке токена

using System;
using System.Threading.Tasks;
using Microsoft.Rest;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using swagger;
using swagger.Models;

namespace CoreClientTest
{
    [TestClass]
    public class MyTests
    {
        [TestMethod]
        public void TestMethod1()
        {
            try
            {
                 GetMyJob().Wait();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

        private static async Task<JobHeader> GetMyJob()
        {
            var tokenRequest = new TokenRequest
            {
                Username = "myusername",
                Password = "mypassword"
            };
            var credentials = new TokenCredentials("bearer token");
            var uri = new Uri("https://localhost:44348", UriKind.Absolute);
            var tokenClient = new Track3API(uri, credentials);
            var tokenResponse = await tokenClient.ApiRequestTokenPostWithHttpMessagesAsync(tokenRequest);
            var tokenContent = await tokenResponse.Response.Content.ReadAsStringAsync();
            var tokenString = JObject.Parse(tokenContent).GetValue("token").ToString();
            var creds2 = new TokenCredentials(tokenString);
            var client2 = new Track3API(uri, creds2);
            var result = await client2.ApiJobsByIdGetWithHttpMessagesAsync(1);
            string resultContent = await result.Response.Content.ReadAsStringAsync();
            var job = JsonConvert.DeserializeObject<JobHeader>(resultContent);
            Console.WriteLine(job.JobNumber);
            return job;

        }
    }
}

Другие вопросы по теме