gpt4 book ai didi

c# - 使用防伪 token 模拟 Windows 用户

转载 作者:行者123 更新时间:2023-11-30 23:26:32 25 4
gpt4 key购买 nike

我有两个 Web API;一种是公开的,一种是内部的。我想让公共(public)的与内部的沟通。但是,我希望内部安全层有两层:

  • Windows 身份验证(已完成)
  • 防伪 token (这是我遇到的麻烦)

现在我正在公共(public) API 中生成 AntiForgery token :

string cookieToken, formToken;
AntiForgery.GetTokens(null, out cookieToken, out formToken);
return cookieToken + ":" + formToken;

然后我在内部 API 的过滤器中提取它们:

var request = actionContext.Request;
if (!request.RequestUri.PathAndQuery.StartsWith("/api"))
{
return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK));
}

string cookieToken = "";
string formToken = "";

IEnumerable<string> tokenHeaders;
if (request.Headers.TryGetValues("RequestVerificationToken", out tokenHeaders))
{
string[] tokens = tokenHeaders.First().Split(':');
if (tokens.Length == 2)
{
cookieToken = tokens[0].Trim();
formToken = tokens[1].Trim();
}
}

try
{
AntiForgery.Validate(cookieToken, formToken);
}
catch (HttpAntiForgeryException ex)
{
return Task.FromResult(new HttpResponseMessage(HttpStatusCode.Unauthorized));
}

return Task.FromResult(new HttpResponseMessage(HttpStatusCode.OK));

这有点管用。我得到的错误是这样的:

The provided anti-forgery token was meant for user "", but the current user is "WINDOWS8VM\Michael".

生成 token 时,我需要以某种方式模拟 Windows 用户,以便用户的相同。

另一个问题是 CredentialCache.DefaultNetworkCredentials 是空的。这几乎可以肯定是因为没有为公共(public) API 打开 Windows 身份验证。但是,应用程序池有一个身份,这就是我要寻找的身份。

最佳答案

由于您只想验证您的内部 api 是否由受信任的调用者调用(即 - 公共(public) api) - 您不需要使用防伪 token 。相反,您可以使用 AF token 用于在公共(public) api 上加密\签署您自己的数据的相同机制,然后解密和验证此数据是您在内部 api 上所期望的。为此,您可以使用 MachineKey.ProtectMachineKey.Unprotect方法。

如果您这样做,请注意用于加密的 key 可能因应用程序而异。查看 machineKey 的描述元素,并注意 IsolateApps 设置的效果。如果您的机器 key 配置了 IsolateApps - 一个 IIS 应用程序将无法解密受另一个保护的数据(与 AF token 相同),即使它们都位于同一台机器上也是如此。

另请注意,如果应用程序在这方面没有被隔离,同一台机器上的任何 IIS 应用程序都将能够使用相同的 key 加密数据并调用您的内部 api。但是,如果您只想保护您的 api 不受网络中其他机器的影响——那应该足够了。

如果您不确定要加密哪些数据 - 合并来自请求本身的所有敏感数据,对其进行哈希处理并保护该哈希。然后在内部 api 中组合相同的数据,对其进行哈希处理,取消保护从调用方收到的数据,并确保未 protected 数据与目标哈希匹配。

关于c# - 使用防伪 token 模拟 Windows 用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36873578/

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