如何在C#.Net 3.5 SP1中显示身份验证对话框

如何在C#.Net 3.5 SP1中显示身份验证对话框,c#,authentication,C#,Authentication,我想访问网络共享文件。 如何显示“系统身份验证”对话框,以便用户可以输入用户名和密码 附言: 通过联合国军司令部, 在WinForm中 我正在编写一个explore控件,我希望在用户双击网络共享文件夹后显示对话框。不确定您是在使用asp.net还是win forms,但在asp.net中,您可以在web.config(或winforms的app.config)中设置身份验证标记 或 您当前如何访问共享?通过UNC还是先将其映射到驱动器号?一种方法是将其与api调用映射到。不确定我是否正确理

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

附言: 通过联合国军司令部, 在WinForm中


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

不确定您是在使用asp.net还是win forms,但在asp.net中,您可以在web.config(或winforms的app.config)中设置身份验证标记




您当前如何访问共享?通过UNC还是先将其映射到驱动器号?一种方法是将其与api调用映射到。

不确定我是否正确理解您的意思,是否要显示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);
    }
}
//
///利用windows UI提示输入密码
/// 
内部静态类身份验证
{
公共结构CREDUI\u信息
{
公共机构的规模;
公共IntPtr hwndParent;
公共字符串pszMessageText;
公共字符串pszcapontext;
公共IntPtr hbmBanner;
}
[DllImport(“credui”)]
专用静态外部凭证返回代码凭证提示凭证(参考凭证信息凭证,
字符串targetName,
IntPtr储备1,
内尔罗,
StringBuilder用户名,
int-maxUserName,
StringBuilder密码,
int maxPassword,
[Marshallas(UnmanagedType.Bool)]参考Bool pfSave,
克雷杜旗),;
[旗帜]
枚举CREDUI_标志
{
密码不正确=0x1,
不持久=0x2,
请求\u管理员=0x4,
排除\u证书=0x8,
需要\u证书=0x10,
显示保存复选框=0x40,
始终\u SHOW\u UI=0x80,
需要智能卡=0x100,
密码\u ONLY\u OK=0x200,
验证\用户名=0x400,
完成\u用户名=0x800,
PERSIST=0x1000,
服务器\u凭据=0x4000,
预期确认=0x20000,
通用_凭证=0x40000,
用户名\目标\凭据=0x80000,
保持_USERNAME=0x100000,
}
公共枚举CredUIReturnCodes
{
无错误=0,
错误\u取消=1223,
错误\u否\u此类\u登录\u会话=1312,
未找到错误=1168,
错误\u无效\u帐户\u名称=1315,
错误\u缓冲区不足\u=122,
错误\u无效\u参数=87,
错误\u无效\u标志=1004,
}
/// 
///提示输入密码。
/// 
///用户。
///密码。
///如果没有错误,则为True。
内部静态bool PromptForPassword(输出字符串用户、输出字符串密码)
{
//设置标志和变量
StringBuilder userPassword=new StringBuilder(),userID=new StringBuilder();
CREDUI_INFO CREDUI=新CREDUI_INFO();
credUI.cbSize=Marshal.SizeOf(credUI);
bool save=false;
CREDUI_FLAGS FLAGS=CREDUI_FLAGS.ALWAYS_SHOW_UI | CREDUI_FLAGS.GENERIC_凭证;
//提示用户
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.无错误);
}
}

使用此对话框获得的凭据,您可以调用LogonUser,正如Phil Harding所解释的。

通过UNC,我将尝试验证。谢谢。我想显示对话框并连接到网络文件夹,但CredUIPromptForCredentials似乎只显示对话框?谢谢。是的,这只会提示用户。也许您需要LogonUser方法。看看这个线程:一个更好的解释:我点击了“IndexOutOfRangeException:警告:StringBuilder缓冲区被非托管代码溢出”;避免在创建StringBuilder时传入较大的初始尺寸。
<authorization>
  <allow Roles="[Roles to view that network sare]" />
</authorization>
    /// <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);
    }
}