加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc – 需要经过身份验证的用户的Ajax调用操作方法问题

发布时间:2020-12-16 06:52:08 所属栏目:asp.Net 来源:网络整理
导读:使用我在最近的一个ASP.NET MVC书籍中找到的技术,我在控制器上有一个action方法,它返回ajax请求的部分视图和正常get请求的完整视图actionresult – 它检查IsAjaxRequest属性Request对象,用于确定要返回的action类型. action方法返回的局部视图返回 HTML以显
使用我在最近的一个ASP.NET MVC书籍中找到的技术,我在控制器上有一个action方法,它返回ajax请求的部分视图和正常get请求的完整视图actionresult – 它检查IsAjaxRequest属性Request对象,用于确定要返回的action类型. action方法返回的局部视图返回 HTML以显示数据库中的记录表.包含操作方法的控制器使用Authorize属性进行标记,以便只有登录的用户才能调用控制器的方法.我正在使用表单身份验证,超时和滑动到期时间为30分钟.

在达到用户30分钟超时后出现问题.由于控制器标有Authorize属性,因此在到期超时后调用action方法会将用户重定向到登录页面.但是,因为这是一个ajax调用,所以我的登录页面的html将返回并呈现在页面中间,该页面应该包含通常由部分视图中的action方法返回的记录的HTML表. ajax调用并没有真正失败,只是返回错误页面的html.

有没有人遇到并处理过这个问题?我试图避免将处理ajax调用的所有服务器端代码移动到不需要经过身份验证的用户的单独控制器,但这似乎是我此时唯一的选择.即使这样也不会产生我期望的行为,因为即使在达到30分钟的超时后,它也会允许用户继续使用网页 – 它不会重定向到登录页面.

谢谢你的建议.

编辑

使用自定义AuthorizeAttribute的下面的解决方案似乎让我朝着正确的方向前进,但我甚至无法使用此代码.似乎在达到到期超时后永远不会到达自定义AuthorizeAttribute中的代码.似乎表单身份验证导致在属性代码之前很久才重定向到登录页面.自定义AuthorizeAttribute是我控制器上唯一的一个.我还有以下web.config值(超时值设置得非常低,以触发测试超时):

<authentication mode="Forms">
        <forms loginUrl="~/Account/Login" timeout="1" slidingExpiration="true" defaultUrl="~/ErrorReport/Index" requireSSL="true" protection="All"/>
</authentication>
<authorization>
        <deny users="?"/>
        <allow users="*"/>
</authorization>
<location path="Content">
        <system.web>
            <authorization>
                <allow users="*"/>
            </authorization>
        </system.web>
    </location>
<location path="Scripts">
        <system.web>
            <authorization>
                <allow users="*"/>
            </authorization>
        </system.web>
</location>

授权web.config元素是否会妨碍?我不应该在ASP.NET MVC中使用它们吗?

解决方法

我实际上有一个关于这个排队的博客文章,我会在评论发布后添加到评论中,但是暂时在这里发生了什么.

在较高级别,当ASP.NET运行时看到401响应代码时,它会自动将其转换为重定向并将用户发送到登录页面.你想要做的是绕过401.

在MVC中,当您使用AuthorizeAttribute时,它会检查用户是否已获得授权,如果没有,则返回HttpUnauthorizedResult.这基本上迫使运行时将用户重定向到登录页面.您要做的是覆盖此行为.

为此,请扩展AuthorizeAttribute:

public class AuthorizeWithAjaxAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);

        if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest())
        {
            filterContext.HttpContext.Response.StatusCode = 200;
            filterContext.Result = /* Some result recognized by the client */
        }
    }
}

当您发出AJAX请求并且响应的数据等于您作为过滤器上下文的结果返回的内容时,只需通过javascript将用户重定向到登录页面.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读