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

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

Я обнаружил, что код SDK, сгенерированный VS2017, использует старую версию autorest, поэтому я перешел на использование 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);
}

}


person Kirsten Greed    schedule 19.05.2018    source источник
comment
Вы должны применить атрибут DataContract к классу, чтобы, когда RestClient использует ссылку на службу, он также генерировал типы. Прочтите это здесь -- docs.microsoft.com/en-us/dotnet/api/   -  person user1672994    schedule 19.05.2018
comment
Вы используете веб-API 2? Или это ASP.NET Core MVC?   -  person Federico Dipuma    schedule 19.05.2018
comment
Добавьте также трассировку стека ошибок, которая должна помочь людям лучше разобраться в проблеме.   -  person Tarun Lalwani    schedule 21.05.2018
comment
чтение dzimchuk.net/generating-clients-for-your-apis- с-авторест   -  person Kirsten Greed    schedule 29.05.2018


Ответы (2)



Наконец-то это работает. В блог Андрея Джимчука я нашел совет по настройке жетон

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;

        }
    }
}
person Kirsten Greed    schedule 29.05.2018