2013-07-29 3 views
2

Я выполняю аутентификацию для своей страницы администратора. Я следил за примерами с разных веб-сайтов, но каждый раз, когда я пытаюсь получить доступ к странице продукта, он всегда отталкивает меня на странице входа в систему.Ролевая аутентификация и авторизация

Это мой код

login.aspx.cs

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack) 
    { 
     if (User.Identity.IsAuthenticated && Request.QueryString["ReturnUrl"] != "") 
     { 
      divError.Visible = true; 
      divError.InnerHtml = accessErrorMessage; 
     } 
    } 
} 

protected void btn_enter_Click(object sender, EventArgs e) 
{ 
    using (var db = new MainDB()) 
    { 
     administrator=db.Administrators.Where(q => q.Name == txtUsername.Text && q.Password == txtPassword.Text).FirstOrDefault(); 

     if(administrator!=null) 
     { 
      administrator.DateLastLogin = DateTime.Now; 
      roles = administrator.Role; 
      adminID = administrator.AdministratorId; 
      db.SaveChanges(); 

      FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
       1, // Ticket version 
       adminID.ToString(),      // Username associated with ticket 
       DateTime.UtcNow,      // Date/time issued 
       DateTime.UtcNow.AddMinutes(30),   // Date/time to expire 
       true,         // "true" for a persistent user cookie    
       **roles,  // User-data, in this case the roles(data example: product,feedback,subscribes** 
       FormsAuthentication.FormsCookiePath); // Path cookie valid for 

      // Encrypt the cookie using the machine key for secure transport 
      string hash = FormsAuthentication.Encrypt(ticket); 
      HttpCookie cookie = new HttpCookie(
       FormsAuthentication.FormsCookieName, // Name of authentication cookie 
       hash); // Hashed ticket 

      // Set the cookie's expiration time to the tickets expiration time 
      if (ticket.IsPersistent) cookie.Expires = ticket.Expiration; 

      // Add the cookie to the list for outgoing response 
      Response.Cookies.Add(cookie); 

      // Redirect to requested URL, or homepage if no previous page 
      // requested 
      string returnUrl = Request.QueryString["ReturnUrl"]; 
      if (returnUrl == null) 
      { 
       returnUrl = "~/admin/"; 
      } 
      // Don't call FormsAuthentication.RedirectFromLoginPage since it 
      // could 
      // replace the authentication ticket (cookie) we just added 
      Response.Redirect(returnUrl); 
     } 
     else 
     { 
      divError.Visible = true; 
      divError.InnerHtml = loginErrorMessage; 
     } 
     //if (FormsAuthentication.Authenticate(txtUsername.Text, txtPassword.Text)) 
      //{ 
      // FormsAuthentication.RedirectFromLoginPage(txtUsername.Text, false); 
      //}  
    } 

global.asax

void Application_AuthenticateRequest(object sender, EventArgs e) 
{ 
    if(Request.IsAuthenticated) 
    { 
     FormsIdentity identity = (FormsIdentity)HttpContext.Current.User.Identity; 

     //Add the roles to the User Principal 
     HttpContext.Current.User = new System.Security.Principal.GenericPrincipal(HttpContext.Current.User.Identity, identity.Ticket.UserData.Split(new char[] { ',' })); 
    } 
} 

web.config

<location path="admin/product"> 
<system.web> 
    <authorization> 
    <!--<allow users="admin"/>--> 
    <allow roles="product"/> 
    <deny users="*"/> 
    </authorization> 
</system.web> 

<location path="admin/spotlight"> 
<system.web> 
    <authorization> 
    <!--<allow users="admin"/>--> 
    <allow roles="spotlight"/> 
    <deny users="*"/> 
    </authorization> 
</system.web> 

<location path="admin/career"> 
<system.web> 
    <authorization> 
    <!--<allow users="admin"/>--> 
    <allow roles="career"/> 
    <deny users="*"/> 
    </authorization> 
</system.web> 

<location path="admin/emailshare"> 
<system.web> 
    <authorization> 
    <!--<allow users="admin"/>--> 
    <allow roles="emailshare"/> 
    <deny users="*"/> 
    </authorization> 
</system.web> 

Могу ли я сделать что-то здесь не так?

+0

являются аутентифицированными пользователями, которые пытаются получить доступ к странице «Продукты», часть любых ролей? –

+0

@FlopScientist да ... в поле «роли» есть несколько значений ... например: продукт, обратная связь, подписчики, , каждый из которых разделен запятой –

+0

Хорошо. и вы уверены, что пользователь, прошедший проверку, находится в роли: Продукты? по крайней мере, с пользовательскими учетными данными, которые вы пытались, которые всегда отправляли вас на страницу входа? –

ответ

1

Вы сначала разрешаете роль, но затем отрицаете всех пользователей.

Правила выполняются в порядке, поэтому постарайтесь указать наиболее конкретное правило как последнее.

<deny users="*"/> 
<allow roles="emailshare"/> 

Другое дело, что вы не устанавливаете Принципала после аутентификации пользователя из БД. Вы должны установить пользователя в HttpContext, и флаг будет аутентифицирован. В противном случае, если (Request.IsAuthenticated) всегда будет ложным.

GenericIdentity userIdentity = 
    new GenericIdentity(ticket.Name); 
GenericPrincipal userPrincipal = 
    new GenericPrincipal(userIdentity, roles); 
Context.User = userPrincipal; 

Обратите внимание, что параметр ролей является разделенной запятой строкой.

Кроме того, не было бы легче использовать build-in provider model? Это мешает вам самому писать код аутентификации. Затем вы можете создать свой custom Membership provider с собственной логикой доступа к данным.

+0

спасибо за быстрый ответ ...Я сделал изменения, как вы упомянули, но он все равно возвращает меня на страницу входа в систему. Извините, потому что я новичок в этом, мой босс дал мне пример и попросил меня следовать этому методу. вот почему я прибегаю к этому .. –

+0

Я обновил свой ответ. Я думаю, вам, возможно, потребуется установить значение IIdentity после аутентификации пользователя. – Ronald

Смежные вопросы