【问题标题】:How to show authentication dialog in C# .Net 3.5 SP1如何在 C# .Net 3.5 SP1 中显示身份验证对话框
【发布时间】:2009-10-21 04:05:09
【问题描述】:

我想访问网络共享文件。 如何显示系统验证对话框以便用户输入用户名和密码?

ps: 通过 UNC, 在 WinForm 中。

我正在编写一个探索控件,我想在用户双击网络共享文件夹后显示对话框。

【问题讨论】:

    标签: c# authentication


    【解决方案1】:

    不确定我的理解是否正确,您想显示 Windows 身份验证对话框吗?

    试试这个:

        /// <summary>
    /// Leverages the windows UI to prompt for a password
    /// </summary>
    internal static class Authentication
    {
        public struct CREDUI_INFO
        {
            public int cbSize;
            public IntPtr hwndParent;
            public string pszMessageText;
            public string pszCaptionText;
            public IntPtr hbmBanner;
        }
    
        [DllImport("credui")]
        private static extern CredUIReturnCodes CredUIPromptForCredentials(ref CREDUI_INFO creditUR,
              string targetName,
              IntPtr reserved1,
              int iError,
              StringBuilder userName,
              int maxUserName,
              StringBuilder password,
              int maxPassword,
              [MarshalAs(UnmanagedType.Bool)] ref bool pfSave,
              CREDUI_FLAGS flags);
    
        [Flags]
        enum CREDUI_FLAGS
        {
            INCORRECT_PASSWORD = 0x1,
            DO_NOT_PERSIST = 0x2,
            REQUEST_ADMINISTRATOR = 0x4,
            EXCLUDE_CERTIFICATES = 0x8,
            REQUIRE_CERTIFICATE = 0x10,
            SHOW_SAVE_CHECK_BOX = 0x40,
            ALWAYS_SHOW_UI = 0x80,
            REQUIRE_SMARTCARD = 0x100,
            PASSWORD_ONLY_OK = 0x200,
            VALIDATE_USERNAME = 0x400,
            COMPLETE_USERNAME = 0x800,
            PERSIST = 0x1000,
            SERVER_CREDENTIAL = 0x4000,
            EXPECT_CONFIRMATION = 0x20000,
            GENERIC_CREDENTIALS = 0x40000,
            USERNAME_TARGET_CREDENTIALS = 0x80000,
            KEEP_USERNAME = 0x100000,
        }
    
        public enum CredUIReturnCodes
        {
            NO_ERROR = 0,
            ERROR_CANCELLED = 1223,
            ERROR_NO_SUCH_LOGON_SESSION = 1312,
            ERROR_NOT_FOUND = 1168,
            ERROR_INVALID_ACCOUNT_NAME = 1315,
            ERROR_INSUFFICIENT_BUFFER = 122,
            ERROR_INVALID_PARAMETER = 87,
            ERROR_INVALID_FLAGS = 1004,
        }
    
        /// <summary>
        /// Prompts for password.
        /// </summary>
        /// <param name="user">The user.</param>
        /// <param name="password">The password.</param>
        /// <returns>True if no errors.</returns>
        internal static bool PromptForPassword(out string user, out string password)
        {
            // Setup the flags and variables
            StringBuilder userPassword = new StringBuilder(), userID = new StringBuilder();
            CREDUI_INFO credUI = new CREDUI_INFO();
            credUI.cbSize = Marshal.SizeOf(credUI);
            bool save = false;
            CREDUI_FLAGS flags = CREDUI_FLAGS.ALWAYS_SHOW_UI | CREDUI_FLAGS.GENERIC_CREDENTIALS;
    
            // Prompt the user
            CredUIReturnCodes returnCode = CredUIPromptForCredentials(ref credUI, Application.ProductName, IntPtr.Zero, 0, userID, 100, userPassword, 100, ref save, flags);
    
            user = userID.ToString();
            password = userPassword.ToString();
    
            return (returnCode == CredUIReturnCodes.NO_ERROR);
        }
    }
    

    使用通过此对话框获得的凭据,您可以按照 Phil Harding here 的说明调用 LogonUser。

    【讨论】:

    • 我想显示对话框并连接到网络文件夹,但 CredUIPromptForCredentials 似乎只显示对话框?谢谢。
    • 是的,这只会提示用户。也许您需要 LogonUser 方法。看看这个线程:objectmix.com/csharp/…
    • 我遇到了“IndexOutOfRangeException:警告:StringBuilder 缓冲区已被非托管代码溢出。”使用上面的 PromptForPassword;在创建 StringBuilder 时通过传入较大的初始大小来避免。
    【解决方案2】:

    您目前如何访问共享?通过 UNC 还是首先将其映射到驱动器号?一种想法是使用wnetaddconnection2 api 调用和CONNECT_INTERACTIVE and CONNECT_PROMPT flags 映射它。

    【讨论】:

    • 通过 UNC,我将尝试身份验证。谢谢。
    【解决方案3】:

    不确定你是在做 asp.net 还是 win forms,但在 asp.net 中你会在 web.config(或 app.config 用于 winforms)中设置身份验证标签

    <authentication mode="Windows"/>
    
        <authorization>
          <allow users="[Users to view that network sare]" />
        </authorization>
    

    <authorization>
      <allow Roles="[Roles to view that network sare]" />
    </authorization>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多