我用 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 中有消息,则会在首页打印出来;如果没有,它至少会完成重定向。