gpt4 book ai didi

c# - OData V4 客户端代码生成器和处理 401 响应

转载 作者:行者123 更新时间:2023-11-30 17:43:05 32 4
gpt4 key购买 nike

我有一个 WebAPI 2.2 w/OData V4 服务,它使用自定义身份验证机制。基本上它类似于 OAuth 的 Bearer 身份验证,这样使用用户名和密码向特定端点发出请求并返回 token 。然后, token 将包含在所有后续请求的授权 header 中。我正在使用 OData V4 客户端代码生成器 (2.3.0) 并使用 DataServiceContext 的 BuildingRequest 事件手动添加授权 header ,如下所示...

private void GetData() {
var context = new DataAccess.Default.Container(new Uri("http://myserver/API/"));

context.BuildingRequest += onBuildingRequest;
var data = context.Computers.ToList();
}
void onBuildingRequest(object sender, Microsoft.OData.Client.BuildingRequestEventArgs e)
{
if (_token == null)
_token = GetToken();
e.Headers.Add("Authorization", "MyToken " + _token);
}

我遇到的问题是 token 在一定时间后过期,所以一段时间后我将开始收到 401 响应,这会导致在上下文中的 IQueryables 获取时抛出异常他们调用了 GetEnumerator(上面代码中的 ToList 调用)。我可以将枚举端点的每个地方都包装起来,但这并不理想。我发现我可以在 DataServiceContext 的 ReceivingResponse 事件中检测到 401 并标记 token 已过期,但这并不能阻止调用失败,它只会使后续调用正常工作。

void context_ReceivingResponse(object sender, ReceivingResponseEventArgs e)
{
if (e.ResponseMessage.StatusCode == 401)
{
_token = null;
}
}

所以在这一点上,我试图找到一种方法来处理 401,而不需要将每个调用(通常在枚举 IQueryable 时)都包装在 try/catch 中。我试图找出一种方法,让 Web 请求以类似于处理基本身份验证的方式处理我的自定义身份验证(如果服务器响应 401 和 WWW-Authenticate header ,并且已为基本身份验证指定凭据另一个请求将使用所需的身份验证 header 自动发送)但没有成功。

如有任何帮助/建议,我们将不胜感激。

最佳答案

解决方案在 AuthenticaionManager 内类(class)。通过注册您自己的 IAuthenticationModule 实现通过其 Register方法,您将能够做您正在寻找的事情。

您可能还需要另一个实现 ICredentials 的类并处理您的身份验证参数,例如您的 token 端点 url 等,然后将其传递给您的 DataServiceContext .您甚至可以使用它来缓存您的最后一个 token 及其过期时间。

到目前为止,我发现处理过期 token 的唯一方法是在从授权服务器获取 token 时存储过期时间,并如果接近过期则刷新它“关闭” 我的意思是它是否会在 n 秒后过期。我更喜欢这个阈值作为我检索 token 的网络超时。如果它已过期或什至接近过期,我将从服务器获取一个新 token ,而无需尝试最后一个 token 。请随意使用本节中您喜欢的任何测量值。 ;) 但是没有办法不止一次响应您的授权服务器的挑战,而且它不会永远挑战您。

看看here有关上述类和接口(interface)的示例。

顺便说一句,在 Portable Class Library 中使用它你可能有点不走运。没有AuthenticaionManager的迹象和 IAuthenticationModule在 pcl。使用某种抽象可能会有所帮助。

关于c# - OData V4 客户端代码生成器和处理 401 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31409718/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com