Форма входа в систему для гостя и администратора проблемы - PullRequest
2 голосов
/ 09 января 2010

У меня есть веб-проект GUI ..

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

Поэтому, когда администратор входит в систему со своим именем пользователя и паролем, я использую проверку подлинности с помощью форм, чтобы перенаправить его на страницу по умолчанию «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>

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

Ответы [ 2 ]

2 голосов
/ 09 января 2010

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

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

2 голосов
/ 09 января 2010

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

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

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

...