7

当您使用无 cookie 会话并且无法将 login.aspx 的名称更改为 httphandler 时,如何解决无限登录循环问题?

即,当具有管理员权限的用户点击注销按钮并将返回到受限页面的 url 传递给 login.aspx 时,另一个没有管理员权限的用户尝试登录,他们将被重定向回登录页面。

我遇到过这个解决方案,但我无法将 login.aspx 的名称更改为 http 处理程序,并且 isauthenticated 函数似乎在具有无 cookie 身份验证的 aspx 页面中不起作用,因为表单身份验证票似乎已从 url 中删除当重定向回登录页面时。

编辑:

因为这个应用程序已经在生产中,所以我无法更改登录/注销/超时过程的页面流程或重命名登录页面。

4

6 回答 6

2

在 login.aspx 页面登录后,检查用户是否被授权访问 returnUrl 中的页面。您可以使用 UrlAuthorizationModule 的这种方法(如果最适合您,也可以使用自定义方法):

System.Web.Security.UrlAuthorizationModule.CheckUrlAccessForPrincipal(

     returnUrl,
     userPrincipal, 
     GET");

如果用户未获得授权,只需重定向到用户可以访问的页面。

获取用户主体:

var roles = System.Web.Security.Roles.GetRolesForUser(username);

var principal = new System.Security.Principal.GenericPrincipal(

   new System.Security.Principal.GenericIdentity(username), 

   roles

);
于 2009-02-19T01:07:49.633 回答
1

几个选项...

一、用户注销时手动重定向回Login.aspx,所以没有ReturnURL。在您的页面上进行与会话超时匹配的元刷新,这样用户就不会点击他们突然无法访问的资源。

二、总是在Login.aspx的Page_Load中注销某人。嘿,为什么不呢?我可以想到一些原因,但也许它们不适用于您的情况。

三、忽略ReturnURL。您不必调用 RedirectFromLoginPage!将用户重定向到登录时的默认登录页面。

于 2009-02-15T05:32:00.747 回答
1

我们遇到了类似的问题,我通过以下方式修复了它:

If "LogOut".Equals(e.CommandName) Then
    FormsAuthentication.SignOut()
    Response.Redirect("~/Login.aspx")
End If

然后在 Login.aspx 中,如果 PostBackUrl 包含将用户发送回 Login.aspx 的 ReturnUrl 参数,我们将其更改为 Login.aspx。

于 2009-02-18T18:01:14.590 回答
0

你能改变页面流程吗?

我的意思是,当用户无权访问资源时,而不是重定向回 l​​ogin.aspx 页面,而是将他们重定向到信息页面。

此页面解释了重定向的原因,并为他们提供了如下选项:

1. Click here to login as another user.
2. Click here to request access to the page.
3. Click here to login again, if your session has expired.

这将消除循环引用,从而消除问题。

于 2009-02-14T21:27:50.303 回答
0

添加一个 http 模块来检查 Request.UrlReferrer 是否是登录页面,如果是,则检查他们是否有权访问 Request.Url,如果没有,则将它们重定向到“您无权查看此页面”。页。

于 2009-02-20T08:06:12.070 回答
0

尽管您说您不能将 login.aspx 的名称更改为 HTTP 处理程序,但您是否尝试过添加 HTTP 301 重定向,以便在请求 login.aspx 时服务器将用户重定向到 HTTP 处理程序,例如 login.ashx?

于 2009-02-20T13:32:44.237 回答