You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

迁移到Azure AD B2C(OWIN)后DevExpress MVC Grid回调无法到达控制器

问题分析与解决方案

针对你将ASP.NET MVC应用从Forms认证迁移到Azure AD B2C(OWIN)后,DevExpress GridView回调(排序/过滤/分页)失效的问题,以下是针对性的排查和解决步骤:

1. 检查Anti-Forgery Token兼容性

DevExpress MVC控件的回调默认依赖Anti-Forgery Token,迁移到Azure AD B2C后,OWIN的身份验证上下文可能导致Token验证失败,直接拦截POST请求:

  • 在GridView配置中显式指定回调路由,并确保控制器Action添加[ValidateAntiForgeryToken]特性:
    // GridViewSettings配置
    settings.CallbackRouteValues = new { Controller = "Dashboard", Action = "DashboardProjectManagementGridView" };
    settings.SettingsBehavior.ConfirmDelete = true; // 示例其他配置
    
    // 控制器Action
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult DashboardProjectManagementGridView(GridViewCallbackArgs args)
    {
        // 原有回调逻辑
        return PartialView("_DashboardProjectManagementGridView", GetData());
    }
    
  • 若OWIN配置了自定义Anti-Forgery设置,需确保其与DevExpress生成的Token格式兼容。

2. 调整Cookie SameSite属性

Azure AD B2C生成的Cookie默认SameSite属性可能为Lax,会阻止POST请求携带Cookie,导致DevExpress回调无法通过身份验证:

  • 在OWIN的Cookie认证配置中修改SameSite属性(仅HTTPS环境可设为None):
    app.UseCookieAuthentication(new CookieAuthenticationOptions
    {
        AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
        CookieSameSite = SameSiteMode.None,
        CookieSecure = CookieSecureOption.Always,
        // 其他Azure AD B2C关联配置
    });
    

3. 验证DevExpress HttpHandler配置

确保Web.config中DevExpress的HttpHandler未被OWIN中间件拦截:

  • 检查system.webServer/handlers节点是否包含DevExpress的处理程序:
    <add name="ASPxHttpHandlerModule" 
         type="DevExpress.Web.ASPxHttpHandlerModule, DevExpress.Web.vXX.X, Version=XX.X.XX.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" 
         verb="GET,POST" path="DX.ashx" preCondition="integratedMode" />
    
  • 确认DevExpress的认证类型适配Cookie认证,在Global.asax中添加:
    protected void Application_Start()
    {
        DevExpress.Web.Security.ASPxSecurity.AuthenticationType = "Cookies";
        // 其他初始化逻辑
    }
    

4. 排查OWIN中间件顺序

OWIN中间件的加载顺序直接影响请求处理,需确保身份验证中间件先于DevExpress控件初始化:

  • 调整Startup.cs中的中间件顺序:
    public void Configuration(IAppBuilder app)
    {
        // 先加载Azure AD B2C身份验证中间件
        app.UseAzureAdB2cAuthentication(GetAzureAdB2COptions());
        // 再初始化DevExpress控件
        app.UseDevExpressControls();
        // 其他中间件配置
    }
    

5. 客户端脚本与隐藏错误排查

虽然你提到无错误抛出,但需检查浏览器控制台的静默脚本错误:

  • 确保页面正确加载DevExpress的脚本和样式,在_Layout.cshtml中添加:
    @Html.DevExpress().GetScripts(new Script { ExtensionSuite = ExtensionSuite.GridView })
    @Html.DevExpress().GetStyles(new Style { ExtensionSuite = ExtensionSuite.GridView })
    
  • 用F12工具查看Network标签,确认是否有DevExpress回调的预请求被拦截,或脚本加载失败。

6. 直接测试回调POST请求

用Postman等工具直接发送POST请求到/Dashboard/DashboardProjectManagementGridView,携带DevExpress回调所需的DXCallback参数:

  • 如果请求被拦截,说明OWIN的授权策略或Azure AD B2C配置阻止了POST请求,需检查是否有全局授权过滤器限制了POST方法。

内容的提问来源于stack exchange,提问作者Ashish George

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:12:22