我创建了一个名为 PrincipalFilter 的过滤器,实现了 IAuthorizationFilter 接口,以设置自定义的 IPrincipal 和 IIdentity。这是一个全局过滤器。我通过 Ninject (3.0) 使用依赖注入,所以我在 NinjectModule 中注册我的过滤器:
this.BindFilter<PrincipalFilter>(FilterScope.Global, 0);
这工作正常。至少我是这么想的。
有一个案例就是问题所在。重要的事实是,我的自定义 IIdentity 的属性 IsAuthenticated 在用户名已知时并不总是返回 true(可以识别用户但未通过身份验证)。防伪令牌出现问题。生成令牌和验证令牌时,当前身份不一样:在一种情况下,这是 mvc 框架的通用身份,在另一种情况下,这是我的自定义身份。2 个身份返回相同的名称,但在某些情况下不会返回相同的 IsAuthenticate 值。用户的名称包含在防伪令牌中;但如果一个身份未经过身份验证,则令牌不使用身份的名称,而是使用一个空字符串。因此令牌无效,因为它包含的名称不是当前身份的名称。
因此,当身份具有名称但未经过身份验证时,标记为 ValidateAntiForgeryTokenAttribute 的操作会出现问题。这是因为 ValidateAntiForgeryTokenAttribute 在我的自定义 PrincipalFilter 之前执行。
所以我的问题是如何确保我的自定义 IAuthorizationFilter 将在 ValidateAntiForgeryTokenAttribute 之前执行?我在注册过滤器时尝试使用 FilterScope 参数,但没有成功。