Я хочу иметь возможность войти в свою базу данных идентификации с именем пользователя и паролем и получить 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);
}
}
Вы используете Web API 2? Или это ASP.NET Core MVC?
Также добавьте трассировку стека ошибок, которая должна помочь людям лучше разобраться в проблеме.
чтение dzimchuk.net/generating-clients-for-your-apis-with-autorest





Вы должны применить атрибут 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.
Я попробовал это, но не увидел никакой разницы в сгенерированной модели (извините за большое переписывание вопроса)
Наконец-то он заработал. Я нашел подсказку на Блог Андрея Дзимчука по настройке токена
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;
}
}
}
Вы должны применить атрибут
DataContractк классу, чтобы, когда RestClient использует ссылку на службу, он также генерировал типы. Прочтите здесь - docs.microsoft.com/en-us/dotnet/api/…