Войти

Показать полную графическую версию : Аутентификация ролями


LilLoco
06-02-2011, 15:52
Сразу прошу прощения, если не сюда пишу!
Здравствуйте!
Возникли проблемы с аутентификацией и авторизацией!
Читал статьи : Часть 1 (http://www.rsdn.ru/article/inet/aspnet1.xml) и Часть 2 (http://www.rsdn.ru/article/inet/aspnet2.xml) Делал все так, как там описано!
В итоге ничего не работает :( Вот что у меня получается :

файл 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
Разобрался, нашел что упустил. Держите, может кому пригодится :

В обработчике 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);
}

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




© OSzone.net 2001-2012