формирует логин для гостя и проблемы с администратором

У меня есть графический интерфейс веб-проекта.

Сначала я работал только с администратором.

Поэтому, когда администратор входит в систему со своим именем пользователя и паролем, я использую проверку подлинности с помощью форм, чтобы перенаправить его на страницу по умолчанию «Default.aspx».

Но теперь я должен работать и с гостями... и при входе в систему

  1. проверьте роль, если это гость, затем перенаправьте его на гостевую страницу, а не на "Default.aspx"

  2. с привилегиями только для чтения... например, он не должен иметь возможности вносить какие-либо изменения в базу данных, даже если есть возможность

я использовал этот код:

 public partial class Login : System.Web.UI.Page
{
    public const int LOGON32_LOGON_INTERACTIVE = 2;
    public const int LOGON32_PROVIDER_DEFAULT = 0;

    WindowsImpersonationContext impersonationContext;

    [DllImport("advapi32.dll")]
    public static extern int LogonUserA(String lpszUserName,
        String lpszDomain,
        String lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);
    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern int DuplicateToken(IntPtr hToken,
        int impersonationLevel,
        ref IntPtr hNewToken);

    [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern bool RevertToSelf();

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
    public static extern bool CloseHandle(IntPtr handle);
  }
 protected void LoginButton_Click(object sender, EventArgs e)
    {

        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;
      if (LogonUserA(UserName.Text, Domain.Text, Password.Text, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
        {

            if (impersonateValidUser(UserName.Text, Domain.Text, Password.Text) == true)
            {
                Label1.Text = "impersonation";
            }
            else
            {
                Label2.Text = "not impersonating";
            }
            //impersonateValidUser(UserName.Text, Domain.Text, Password.Text);
            System.Security.Principal.WindowsIdentity wi = System.Security.Principal.WindowsIdentity.GetCurrent();
            System.Security.Principal.WindowsPrincipal wp = new System.Security.Principal.WindowsPrincipal(wi);
            if (wp.IsInRole("Administrators"))
            {

                BadCredentials.Visible = false;
                Session["userName"] = UserName.Text;
                Session["password"] = Password.Text;
                Session["domain"] = Domain.Text;
                FormsAuthentication.RedirectFromLoginPage(UserName.Text, false);
            }
            else if(wp.IsInRole("Guest"))
            {
                ?? I want to redirect it to the guestpage.aspx and not the default.aspx
            }

        }
        else
        {
            BadCredentials.Visible = true;
            Label4.Text = "not valid user";
        }
     }
private bool impersonateValidUser(String userName, String domain, String password)
    {
        WindowsIdentity tempWindowsIdentity;
        IntPtr token = IntPtr.Zero;
        IntPtr tokenDuplicate = IntPtr.Zero;

        if (RevertToSelf())
        {
            if (LogonUserA(userName, domain, password, LOGON32_LOGON_INTERACTIVE, LOGON32_PROVIDER_DEFAULT, ref token) != 0)
            {
                if (DuplicateToken(token, 2, ref tokenDuplicate) != 0)
                {
                    tempWindowsIdentity = new WindowsIdentity(tokenDuplicate);
                    impersonationContext = tempWindowsIdentity.Impersonate();
                    if (impersonationContext != null)
                    {
                        CloseHandle(token);
                        CloseHandle(tokenDuplicate);
                        return true;
                    }
                }
            }
        }
        if (token != IntPtr.Zero)
            CloseHandle(token);
        if (tokenDuplicate != IntPtr.Zero)
            CloseHandle(tokenDuplicate);
        return false;
    }

Это очень важно для меня... буду признателен за любые предложения... спасибо

есть ли какие-то настройки в SQL или IIS для режима только для чтения для гостя????

я использовал это в своем веб-конфиге

 <authentication mode="Forms">
    <forms loginUrl="Login.aspx" defaultUrl="~/Default.aspx" name="Cookie" timeout="120" path="/">
    </forms>
  </authentication>
  <authorization>
    <deny users="?"/>
    <allow users="*"/>
  </authorization>

и это работает..


person user175084    schedule 08.01.2010    source источник


Ответы (2)


Вы выполняете проверку подлинности с помощью форм или проверку подлинности Windows? Вышеприведенное выглядит как аутентификация Windows (т.е. хост-компьютер аутентифицирует пользователя). Аутентификация с помощью форм может выполняться для чего угодно (например, для БД и т. д.).

Если вы хотите управлять пользователями (например, в БД), вам необходимо разработать эти механизмы. Взгляните на Поставщик членства< /а>. Вы также можете попытаться зарегистрировать пользователя на компьютере с Windows (или в домене), и если это не удастся, вернуться к использованию собственной БД и т. д.

person GrayWizardx    schedule 08.01.2010
comment
На самом деле я выполняю аутентификацию с помощью форм, но чтобы узнать, является ли пользователь администратором на этом компьютере, я использовал некоторые свойства Windows... я не знал, как проверить это в аутентификации с помощью форм... если вы можете предложить лучший способ, я ценю это ... спасибо .. я на самом деле использую это в своем веб-конфигураторе, и он работает ‹режим аутентификации = формы› ‹forms loginUrl=Login.aspx defaultUrl=~/Default.aspx name=Cookie timeout=120 path=/› ‹/ формы› ‹/аутентификация› ‹авторизация› ‹запретить пользователям=?/› ‹разрешить пользователям=*/› ‹/авторизация› - person user175084; 09.01.2010
comment
Без учетной записи Windows вы не могли видеть, являются ли они гостем на машине, гость - это конкретная учетная запись Windows. Что вы можете сделать, так это проверить, входит ли этот пользователь в предопределенную группу в базе данных и т. д., и если нет, то он автоматически является гостем. - person GrayWizardx; 09.01.2010

Чтобы справиться с проблемой перенаправления, вам просто нужно самостоятельно создать билет проверки подлинности с помощью форм, а затем выполнить Response.Redirect вместо использования встроенного метода RedirectFromLoginPage.

Посмотрите шаги 7–10 здесь: http://msdn.microsoft.com/en-us/library/aa302399.aspx

Что касается проблемы авторизации безопасности, вы должны использовать метод User.IsInRole для включения/отключения функций в приложении, чтобы пользователи не делали то, что им не следует. Если этого недостаточно, вы можете рассмотреть возможность предоставления разных соединений Sql/пользователей/ролей Sql для каждого рулона приложения. Однако это, вероятно, перебор.

person Daniel Auger    schedule 08.01.2010