c# - .Net Core WindowsIdentity 模拟似乎不起作用

标签 c# .net-core .net-core-3.1

我有以下代码:

var baseUrl = "https://" + GetIdentityProviderHost(environment) + "/oauth2/authorize";
var query = $"?scope=openid&response_type=code&redirect_uri={redirectUrl}&client_id={clientId}";
var combinedUrl = baseUrl + query;

var currentUser = WindowsIdentity.GetCurrent(); 

await WindowsIdentity.RunImpersonated(currentUser.AccessToken, async() =>
{
    using (var client = new WebClient{ UseDefaultCredentials = true })
    {
        var response = client.DownloadString(combinedUrl);          
        Console.WriteLine(response);
    }
});

它基本上构造一个 URL,然后调用它。

调用返回 401(未授权)。

但如果我拿 combinedUrl并将其粘贴到 chrome 或 postman it 完美运行 .这告诉我我的通话可以正常工作,因为 Chrome 正在使用我的 Windows 凭据进行通话。

我添加了 WindowsIdentity.RunImpersonated尝试解决此问题的代码。但是好像没有什么效果。

如何使用集成 Windows 身份验证 (IWA) 进行网络调用?

细节:

如果我运行以下 cURL 命令,它会起作用:
curl -L --negotiate -u : -b ~/cookiejar.txt "https://myIdp.domain.net/oauth2/authorize?scope=openid&response_type=code&redirect_uri=https://localhost:5001&client_id=my_client_id_here"

我不确定如何在 C# 代码中复制所有这些。

仅供引用:我在这个问题中专门询问了这个 cURL 命令(因为这个问题的重点是模拟):Replicate cURL Command Using Redirect and Cookies in .Net Core 3.1

最佳答案

我面前没有 Windows 盒子,所以我无法彻底验证这一点。但这似乎有点像蛇坑,基于讨论,例如在这里(尤其是从这条评论开始):
https://github.com/dotnet/runtime/issues/24009#issuecomment-544511572

关于如何在异步调用中保持身份,似乎有各种不同的意见。

但如果你看那个评论中的例子,

app.Use(async (context, next) =>
{
    await WindowsIdentity.RunImpersonated(someToken, () => next());
});

它看起来不像你作为 WindowsIdentity.RunImpersonated 的第二个参数发送的函数应该是异步的。

你有没有尝试过:

var baseUrl = "https://" + GetIdentityProviderHost(environment) + "/oauth2/authorize";
var query = $"?scope=openid&response_type=code&redirect_uri={redirectUrl}&client_id={clientId}";
var combinedUrl = baseUrl + query;

var currentUser = WindowsIdentity.GetCurrent(); 

await WindowsIdentity.RunImpersonated(currentUser.AccessToken, () =>
{
    using (var client = new WebClient{ UseDefaultCredentials = true })
    {
        var response = client.DownloadString(combinedUrl);          
        Console.WriteLine(response);

    }
});

您可以在 WindowsIdentity.RunImpersonated 上找到 Microsoft 文档这里:https://docs.microsoft.com/en-us/dotnet/api/system.security.principal.windowsidentity.runimpersonated?view=netcore-3.1

关于c# - .Net Core WindowsIdentity 模拟似乎不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60839845/

相关文章:

c# - 在 C# 中用正则表达式替换文本中的字符

c# - 什么是NullReferenceException,如何解决?

c# - 如何修复 CA1000 不要在泛型类型上声明静态成员

visual-studio - 在 .NET Core 2.0 中查看项目属性时出错

json.net - StringEnumConverter 用作属性但不是全局的

c# - 多个 AddParameter 调用只添加第一个参数,忽略其余参数

c# - 修改强类型数据集连接字符串的数据源

c# - 获取最新后目录不为空消息

没有 TransactionScope 的 .Net Core 事务装饰器

c# - .NET 3.1 中的 ObjectDisposedException/SocketsHttpHandler