web-dev-qa-db-ja.com

.Net Core WindowsIdentity偽装が機能していないようです

私は次のコードを持っています:

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に貼り付けると、それは完全に機能します。 Chromeが私のWindows資格情報を使用して電話をかけているため、私の電話は機能することがわかります。

この問題を回避するためにWindowsIdentity.RunImpersonatedコードを追加しました。しかし、効果はなかったようです。

統合Windows認証(IWA)を使用してWeb通話を発信するにはどうすればよいですか?


詳細:

次の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コマンドについて具体的に質問しました(この質問は偽装に焦点が当てられていたため): 。Net Core 3.1でリダイレクトとCookieを使用してcURLコマンドを複製する

4
Vaccano

なりすましコードは問題ありません。 WindowsアプリまたはAsp.netコアアプリを作成していますか?コードを実行しているユーザーが標準ユーザーであり、偽装できないというユーザーアカウントの問題がある可能性があります。ドメインユーザーを試して、テスト用の管理者権限を付与してください。もう1つの問題は、インタラクティブモードでのみ使用できることです。コンソールアプリのコードと同様です。 //次の例は、WindowsIdentityクラスを使用してユーザーを偽装する方法を示しています。
// 重要な注意点:
//このサンプルでは、​​コンソール画面でパスワードを入力するようユーザーに求めています。
//コンソールウィンドウはパスワードが画面に表示されます。
//は、マスクされた入力をネイティブでサポートしていません。

using System;  
using System.Runtime.InteropServices;  
using System.Security;  
using System.Security.Principal;  
using Microsoft.Win32.SafeHandles;  

public class ImpersonationDemo  
{  
    [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)]  
    public static extern bool LogonUser(String lpszUsername, String lpszDomain, String lpszPassword,  
        int dwLogonType, int dwLogonProvider, out SafeAccessTokenHandle phToken);  

    public static void Main()  
    {  
        // Get the user token for the specified user, domain, and password using the   
        // unmanaged LogonUser method.   
        // The local machine name can be used for the domain name to impersonate a user on this machine.  
        Console.Write("Enter the name of the domain on which to log on: ");  
        string domainName = Console.ReadLine();  

        Console.Write("Enter the login of a user on {0} that you wish to impersonate: ", domainName);  
        string userName = Console.ReadLine();  

        Console.Write("Enter the password for {0}: ", userName);  

        const int LOGON32_PROVIDER_DEFAULT = 0;  
        //This parameter causes LogonUser to create a primary token.   
        const int LOGON32_LOGON_INTERACTIVE = 2;  

        // Call LogonUser to obtain a handle to an access token.   
        SafeAccessTokenHandle safeAccessTokenHandle;  
        bool returnValue = LogonUser(userName, domainName, Console.ReadLine(),  
            LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT,  
            out safeAccessTokenHandle);  

        if (false == returnValue)  
        {  
            int ret = Marshal.GetLastWin32Error();  
            Console.WriteLine("LogonUser failed with error code : {0}", ret);  
            throw new System.ComponentModel.Win32Exception(ret);  
        }  

        Console.WriteLine("Did LogonUser Succeed? " + (returnValue ? "Yes" : "No"));  
        // Check the identity.  
        Console.WriteLine("Before impersonation: " + WindowsIdentity.GetCurrent().Name);  

        // Note: if you want to run as unimpersonated, pass  
        //       'SafeAccessTokenHandle.InvalidHandle' instead of variable 'safeAccessTokenHandle'  
        WindowsIdentity.RunImpersonated(  
            safeAccessTokenHandle,  
            // User action  
            () =>  
            {  
                // Check the identity.  
                Console.WriteLine("During impersonation: " + WindowsIdentity.GetCurrent().Name);  
            }  
            );  

        // Check the identity again.  
        Console.WriteLine("After impersonation: " + WindowsIdentity.GetCurrent().Name);  
    }  
}
0
Jin Thakur