- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们有一个使用 ASP.net 成员(member)资格来提供基本登录机制的应用程序。一切正常,但最近我们发现,如果您在登录时尝试进入登录页面,您将被重定向到“未经授权”页面。
Example user flow.
User goes to secured page (whole application requires login, there's not even a home page you can visit, just redirects straight to login). This redirects them to https://www.example.com/Account/Login.
User logs in and is redirected to home page https://www.example.com/. They are logged in and everything works fine.
User clicks a bookmark that happens to be set to https://www.example.com/Account/Login
User is redirected to generic Unauthorized page.
我有<Authorize()>
我的 AccountController 上的属性,但 <AllowAnonymous()>
正如我们之前看到的,“登录”操作上的属性在您未登录时工作正常,但当您登录时,它似乎会有点困惑。
AccountController
<Authorize()> _
Public Class AccountController
'''other functions go here'''
<AllowAnonymous()> _
Public Function Login(ByVal returnUrl As String) As ActionResult
ViewData("ReturnUrl") = returnUrl
Return View()
End Function
AuthorizeRedirect过滤器
<AttributeUsage(AttributeTargets.[Class] Or AttributeTargets.Method)> _
Public Class AuthorizeRedirect
Inherits AuthorizeAttribute
Private Const IS_AUTHORIZED As String = "isAuthorized"
Public RedirectUrl As String = "~/Home/Unauthorized"
Protected Overrides Function AuthorizeCore(httpContext As System.Web.HttpContextBase) As Boolean
Dim isAuthorized As Boolean = MyBase.AuthorizeCore(httpContext)
httpContext.Items.Add(IS_AUTHORIZED, isAuthorized)
Return isAuthorized
End Function
Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext)
MyBase.OnAuthorization(filterContext)
Dim isAuthorized = If(filterContext.HttpContext.Items(IS_AUTHORIZED) IsNot Nothing, Convert.ToBoolean(filterContext.HttpContext.Items(IS_AUTHORIZED)), False)
If Not isAuthorized AndAlso filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated Then
filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl)
End If
End Sub
End Class
看到这一切,我认为最简单的解决方案是检查用户是否已经在我的登录操作中登录并自己将其重定向,就像这样。
<AllowAnonymous()> _
Public Function Login(ByVal returnUrl As String) As ActionResult
If User.Identity.IsAuthenticated() Then
Return RedirectToAction("Index", "Home")
End If
ViewData("ReturnUrl") = returnUrl
Return View()
End Function
但是AuthorizeFilter总是先跳出来,这是可以理解的,但我不太清楚最后一个缺失的部分。我想要的只是如果用户在登录时进入登录屏幕,而不是显示“您无权查看此页面”,而是将其重定向到主页。我错过了什么?
<小时/>编辑以使事情更清晰
登录后,我会转到 /Account/Login
。这个302
将我重定向到 /Home/Unauthorized
(我的自定义页面)。不过,我仍然处于登录状态。
网络请求
未经授权的页面。请注意,突出显示的黄色部分显示我仍处于登录状态。只有在您登录时才会出现此信息。未登录时,您将看不到任何信息。
问题似乎是,当我已经登录并尝试访问包含 [AllowAnonymous]
的页面时,应用程序不知道该怎么做。其上的属性。如果有的话,我在这里看到的行为比它实际上再次给我一个登录页面更好,因为这会令人困惑,但它仍然不理想。
编辑 2 - 逐行单步执行代码
以下是逐行执行代码的结果。
页 /Account/Login
登录时。
OnAuthorization
中的第一个断点子地址 AuthorizeRedirect
过滤。
Public Overrides Sub OnAuthorization(filterContext As AuthorizationContext)
MyBase.OnAuthorization(filterContext)
Dim isAuthorized = If(filterContext.HttpContext.Items(IS_AUTHORIZED) IsNot Nothing, Convert.ToBoolean(filterContext.HttpContext.Items(IS_AUTHORIZED)), False)
If Not isAuthorized AndAlso filterContext.RequestContext.HttpContext.User.Identity.IsAuthenticated Then
filterContext.RequestContext.HttpContext.Response.Redirect(RedirectUrl)
End If
End Sub
以 Dim isAuthorized
开头的行返回 False。 filterContext.HttpContext.Items(IS_AUTHORIZED)
什么都没有(项目列表中不存在)。
这意味着下一个 If 语句的计算结果为 True(Not isAuthorized AndAlso ...IsAuthenticated),导致重定向到 RedirectUrl
.
发生这种情况后,它似乎会返回相同的步骤,但这次它的计算结果为 false,这意味着不会发生重定向,尽管我猜测这只是“未经授权”页面加载并通过再次使用相同的代码。
我尝试将以下 block 添加到 Login
的顶部AccountController
的功能.
If User.Identity.IsAuthenticated() Then
Return RedirectToAction("Index", "Home")
End If
但是,当然,由于过滤器是在操作发生之前运行的,所以直到之后它已经将我重定向到 Unauthorized
之前,此代码才会被命中。 (通过逐步验证)。
最佳答案
AuthorizationAttribute 的基类在其 OnAuthorization
方法中包含以下代码:
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);
if (skipAuthorization)
{
return;
}
if (AuthorizeCore(filterContext.HttpContext))
// ...
因此,如果 Controller 操作定义了 AllowAnonymousAttribute
,则您的 AuthorizeCore
方法将不会被调用。
因为 filterContext.HttpContext.Items(IS_AUTHORIZED)
永远不会被设置。
您只需复制 here 中的代码即可实现OnAuthorization
而不调用基类。这样您就可以按照您想要的方式处理缓存。
顺便说一句,我的印象是,如果授权失败,请求管道中的后续进程无论如何都会重定向到登录页面。这就是 OnAuthorization
的基本实现将 filterContext.Result
设置为新的 HttpUnauthorizedResult
实例的原因。因此,尚不完全清楚为什么要覆盖 OnAuthorization 并首先进行重定向。如果您想要某种自定义授权代码,只需从 AuthorizeCore
返回 true
或 false
就足够了。
关于当用户登录时,ASP.NET 成员(member)登录重定向到未经授权的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38640354/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!