【发布时间】:2020-03-21 23:05:13
【问题描述】:
我有一个使用 .Net Core Web API Rest 服务的 .Net Core MVC 网站。 Rest 客户端代码由 AutoRest 生成。
为了验证目的,API 有两个端点:
\token:它将接受两个参数用户名和密码,和 返回两件事:access_token(JWT Token),并随机生成refresh_token.\token\refresh将接受两个参数:access_token和refresh_token并返回新的access_token和新的refresh_token。
access_token 生命周期为 24 小时,
refresh_token 生命周期为 5 天
让我们转到网站部分。 UserController 有 5 种标准动作方法,Index, Details, Create, Edit and Delete。
在第一次请求索引路由时,检索所有用户的列表。我通过向 AutoRest 生成的 API 客户端提供用户名和密码来获取令牌。
string access_token = GetAccessToken(username, password); // this will call API's \token endpoint and return access_token
HttpContext.Session.SetString("api_access_token", access_token); // put this token in session variable so it can be used for further requests.
var tokenCredentials = new Microsoft.Rest.TokenCredentials(access_token);
var api = new ApiServiceClient2.ApiServiceClientProxy2(BaseUri, tokenCredentials);
然后我可以调用我的实际请求来获取用户列表
IList<ApiServiceClient.Models.AppUser> list = api.AppUser.GetAppUser();
这里完成了一个请求。
让我们转到第二个请求(详细信息路由),我正在获取特定 ID 的用户详细信息,在这里我可以从会话中检索令牌,其余部分相同,创建凭据对象并调用目标操作方法。
string access_token = HttpContext.Session.GetString("api_access_token");
var tokenCredentials = new Microsoft.Rest.TokenCredentials(access_token);// I can put this token in session variable so it can be used for further requests.
var api = new ApiServiceClient2.ApiServiceClientProxy2(BaseUri, tokenCredentials);
ApiServiceClient.Models.AppUser obj = api.AppUser.GetAppUser1(id);
类似地,我可以编写Create, Edit and Delete 操作方法,方法是从会话中获取令牌并传递给 API 客户端。
如果我的令牌过期了怎么办,网站怎么知道它必须通过向\token\refresh端点发送请求来刷新令牌。此外,当刷新令牌过期时,通过将用户名和密码重新发送到 \token 端点来生成新令牌。
那么,使用此身份验证方案调用 API 的最佳方法是什么。我是否应该在控制器的每个操作方法中编写此逻辑(生成令牌、检查令牌到期、刷新令牌、再次检查刷新令牌到期)? 显然一个合理的网站不会只有一个控制器,一个网站有10-15个控制器,每个控制器都有这5个动作方法,在每个动作方法中写同样的逻辑会很麻烦。
正如我所提到的,我已经使用 AutoRest 工具生成了 API 客户端代码。我想使用这些自动生成的模型类和 api 客户端。这使得在哪里注入这个逻辑变得更加困难。
【问题讨论】:
标签: c# rest asp.net-core asp.net-core-webapi autorest