Ролевая аутентификация и авторизация
Я делаю аутентификацию для моей страницы администратора. Я следовал примерам с разных веб-сайтов, но каждый раз, когда я пытаюсь получить доступ к странице продукта, мне всегда приходится возвращаться на страницу входа.
Это мой код
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>
Я что-то здесь не так делаю?
1 ответ
Сначала вы разрешаете роль, но затем отказываете всем пользователям.
Правила выполняются по порядку, поэтому постарайтесь указать наиболее конкретное правило как последнее.
<deny users="*"/>
<allow roles="emailshare"/>
Другое дело, что вы не устанавливаете Принципал после аутентификации пользователя из БД. Вам нужно установить пользователя в HttpContext и установить флажок "Аутентифицировано". В противном случае, если (Request.IsAuthenticated)
всегда будет ложным
GenericIdentity userIdentity =
new GenericIdentity(ticket.Name);
GenericPrincipal userPrincipal =
new GenericPrincipal(userIdentity, roles);
Context.User = userPrincipal;
Обратите внимание, что параметр role - это строка, разделенная запятыми.
Кроме того, не будет ли проще использовать встроенную модель провайдера? Это мешает вам самостоятельно написать весь код аутентификации. После этого вы можете создать своего собственного провайдера членства с собственной логикой доступа к данным.