Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Аутентификация ролями (http://forum.oszone.net/showthread.php?t=198745)

LilLoco 06-02-2011 15:52 1606005

Аутентификация ролями
 
Сразу прошу прощения, если не сюда пишу!
Здравствуйте!
Возникли проблемы с аутентификацией и авторизацией!
Читал статьи : Часть 1 и Часть 2 Делал все так, как там описано!
В итоге ничего не работает :( Вот что у меня получается :

файл web.config :
Код:

<authentication mode="Forms">
      <forms protection ="All" cookieless="UseCookies" name=".AuthMisis" defaultUrl="~/home.aspx" loginUrl="~/home.aspx"/>
</authentication>

в директории, где доступ только для ролей web.config(директория admins)
Код:

<?xml version="1.0"?>
<configuration>
    <system.web>
      <authorization>
        <allow roles="Admins"/>
        <deny users="*"/>
      </authorization>
    </system.web>
</configuration>

Пользователи и роли хранятся в таблицах базе SQLServer.
Есть страничка login.aspx, обработчик кнопки логин :
Код:

void login_Click(object sender, EventArgs e)
                {
                        TextBox login = (TextBox)phProfile.FindControl("txtLogin");
                        TextBox pass = (TextBox)phProfile.FindControl("txtPass");
                        if ((login.Text.Length == 0) || (pass.Text.Length == 0))
                                return;
                        if (DB.FindUser(login.Text, pass.Text))
                        {
                                //Do It, If Founded
                                string Roles = DB.FindRoles(login.Text);
                                FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1,login.Text,DateTime.Now,DateTime.Now.AddMinutes(20),false,Roles);
                                Roles = FormsAuthentication.Encrypt(ticket);
                                Response.Cookies.Add(new HttpCookie(".RolesMisis",Roles));
                                FormsAuthentication.RedirectFromLoginPage(login.Text, false);
                        }
                        else
                        {
                                //Do It, If not Founded
                                return;
                        }
                }

Методы FindUser и FindRoles, соответственно, возвращают true, если пользователь найден, и строку с содержимым ролей!
Оба метода возвращают все верно, было проверено!
После всего этого к страницам в директории admins все равно нету доступа :(
Что я упустил?, почему не работает?, подскажите :)

LilLoco 09-02-2011 16:16 1608546

Разобрался, нашел что упустил. Держите, может кому пригодится :

В обработчике AuthenticateRequest:
Код:

HttpApplication app = (HttpApplication)sender;
if (app.Request.IsAuthenticated)
{
      string[] roles;
      if (app.Request.Cookies[".RolesMisis"] == null)
      {
          Здесь выполнить, например, поиск по базе если куки нет)
      }
      else
      {
          FormsAuthenticationTicket ticket =FormsAuthentication.Decrypt(app.Context.Request.Cookies[".RolesMisis"].Value);
          roles = ticket.UserData.Split(new char[] { ';' });
      }
          app.Context.User = new GenericPrincipal(app.Context.User.Identity, roles);
}

Вот вроде бы и все) У меня работает!


Время: 17:45.

Время: 17:45.
© OSzone.net 2001-