如何让JWT在Autorest生成的SDK中工作? (ASP.NET Core 2.0)

我希望能够使用用户名和密码登录我的身份数据库并检索JWT。 然后我想使用JWT从我的API安全地访问数据。

我发现VS2017生成的SDK代码使用了旧版本的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 { ///  /// Returns Job Header for Id ///  ///  ///  [HttpGet("{id}", Name = "Get")] public IActionResult Get(int id) { var header1 = new JobHeader { JobNumber = "1234", Id = id, CustomerPurchaseOrderNumber = "fred" }; return Ok(header1); } 

}

您应该在类上应用DataContract属性,以便在RestClient使用服务引用时,它还会生成类型。

在这里阅读。

您还应该在Property上附加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 Client使用该服务时,它将在客户端为那些归属于DataContract的类生成类。

最后它正在运作。 我在Andrei Dzimchuk的博客上找到了关于设置令牌的提示

 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 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(resultContent); Console.WriteLine(job.JobNumber); return job; } } }