Я украсил свой контроллер атрибутом Authorize следующим образом:
[Authorize(Roles="ExecAdmin")]
Если я попытаюсь перейти на этот контроллер после входа в систему как пользователь, который не является ExecAdmin, он, похоже, пытаетсяперенаправить на страницу входа.НО, страница, которую он пытается перенаправить, не является моей страницей входа в систему, это представление, называемое LogOnUserControl.ascx.Это частичное представление, которое не отображается на моей странице входа в систему.
Я понятия не имею, почему он это делает - или, возможно, он пытается перенаправить на какую-то другую страницу, на которой отображается LogOnUserControl.ASCX.Или, может быть, он ищет что-нибудь с «LogOn» в названии?(Хотя мое имя входа в систему называется LogOn.aspx ...)
Как мне узнать, на какую страницу перенаправлять?
ОБНОВЛЕНИЕ: У меня есть это в global.asax
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == "")
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch
{
return;
}
string[] roles = authTicket.UserData.Split(new char[] { ';' });
//Context.ClearError();
if (Context.User != null)
{
Context.User = new System.Security.Principal.GenericPrincipal(Context.User.Identity, roles);
}
}
... поскольку я использую нестандартный способ определения ролей;т. е. я не использую схему членства в ASP.NET (провайдеры ролей определены в web.config и т. д.).Вместо этого я устанавливаю роли следующим образом:
// get user's role
string role = rc.rolesRepository.GetUserType(rc.loginRepository.GetUserID(userName)).ToString();
// create encryption cookie
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
1,
userName,
DateTime.Now,
DateTime.Now.AddMinutes(120),
createPersistentCookie,
role //user's role
);
// add cookie to response stream
string encryptedTicket = FormsAuthentication.Encrypt(authTicket);
System.Web.HttpCookie authCookie = new System.Web.HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket);
System.Web.HttpContext.Current.Response.Cookies.Add(authCookie);
(Это вызывается после того, как пользователь был проверен.)
Не уверен, как это может повлиять на все это, хотя ...
ОБНОВЛЕНИЕ: благодаря решению Роберта, вот как я решил это - расширьте класс AuthorizeAttribute:
public class AuthorizeAttributeWithMessage : AuthorizeAttribute
{
private string _message = "";
public string Message
{
get {
return _message;
}
set {
_message = value;
}
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.IsAuthenticated)
{
// user is logged in but wrong role or user:
filterContext.Controller.TempData.Add("Message", Message);
}
base.HandleUnauthorizedRequest(filterContext);
}
}
Затем в представлении LogOn:
<%
if (HttpContext.Current.Request.IsAuthenticated)
{
// authenticated users should not be here
Response.Redirect("/Home/Index");
}
%>
И ввид домашней страницы:
<% if (TempData != null && TempData.Count > 0 && TempData.ContainsKey("Message"))
{ %>
<div class="largewarningtext"><%= TempData["Message"]%></div>
<% } %>
И поверх затронутых контроллеров:
[AuthorizeAttributeWithMessage(Roles = "Consultant,ExecAdmin", Message = "You do not have access to the requested page")]
Преимущество ВСЕГДА заключается в перенаправлении любого аутентифицированного пользователя, который оказывается на Logon.aspx - аутентифицированных пользователейне должно быть там.Если в TempData есть сообщение, оно распечатает его на домашней странице;если нет, то он, по крайней мере, сделал перенаправление.