Как показать диалог аутентификации в.Net 3.5 SP1 C#

Книга «Банды четырех» «Шаблоны проектирования» , в основном, посвящена тому, почему предпочитать композицию, а не наследование, и предлагает множество способов сделать это. Некоторые причины:

  1. классов увеличивает сложность кодовой базы

  2. Во многих более новых языках наследование ограничено одним классом, в то время как вы можете составлять как сколько бы вы ни хотели
  3. Базовые классы не могут быть изменены во время выполнения (по сути, проблема, с которой вы сталкиваетесь).

6
задан zunyite 20 October 2009 в 18:02
поделиться

3 ответа

Как вы сейчас получаете доступ к общему ресурсу? Через UNC или сначала сопоставить его с буквой диска? Одна из идей состоит в том, чтобы отобразить его с помощью вызова API wnetaddconnection2 с флагами CONNECT_INTERACTIVE и CONNECT_PROMPT .

2
ответ дан 8 December 2019 в 16:05
поделиться

Не уверен, правильно ли я вас понял, вы хотите показать диалоговое окно аутентификации 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);
    }
}

Используя учетные данные, полученные в этом диалоговом окне, вы можете затем вызвать LogonUser как объяснил Фил Хардинг здесь .

13
ответ дан 8 December 2019 в 16:05
поделиться

Не уверен, что вы используете asp.net или формы win, но в 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>
0
ответ дан 8 December 2019 в 16:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: