我们有一个客户要求我们使用联合身份验证来保护其 Sitecore 8.0 站点的一部分。他们将站点托管在一台服务器上,并且他们的身份验证系统位于后端的其他位置。这是他们给我的用于实现身份验证的代码:
Startup.Auth.cs public partial class Startup { private static string realm = System.Configuration.ConfigurationManager.AppSettings["ida:Wtrealm"]; 私有静态字符串 adfsMetadata = System.Configuration.ConfigurationManager.AppSettings["ida:ADFSMetadata"];
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = realm,
MetadataAddress = adfsMetadata
});
}
}
然后,它就像将 [Authorize] 属性添加到控制器操作一样简单。对于这个特定的控制器动作,有一个 [HttpGet] 动作和一个 [HttpPost] 动作。
当我访问安全页面时,我被正确重定向到他们的 ADFS 系统。然后我可以输入凭据,输入正确的凭据后,我会被重定向回我的安全页面,但是会引发以下错误:
从客户端检测到具有潜在危险的 Request.Form 值 (wresult=t:RequestSecurityTo...)。
我知道我已成功登录,因为我可以浏览并访问另一个页面或完全关闭浏览器,它不会再次将我重定向回登录页面,它只会让我回到安全页面并显示该错误.
我尝试在 get 操作和 post 操作上禁用输入验证,我尝试从这些操作中删除所有内容并简单地返回一个字符串而不是 ActionResult,以便我可以确保页面上没有任何内容导致任何事情诡异的。
我认为是 ADFS 登录页面导致了问题,因为当您访问登录页面时,在成功登录后,该页面会返回到您尝试访问的安全页面,可能包括一些 HTML 或 JS在标题中并导致验证错误。在随后访问我的安全页面时,由于我已经登录,我可以看到页面短暂地重定向到 ADFS 页面(可能是为了测试我仍然登录),然后将我弹回我的安全页面。
我还尝试运行 Wireshark 和 Fiddler 来尝试查看标题中出现的内容,但我似乎无法从这些工具中获得任何有用的信息(尤其是 Wireshark,我不知道如何获取标题信息并且我可以看到的安全页面上没有发生 HTTP 请求(发布或获取)。
还有其他我可以尝试解决此问题的方法吗?为什么我的控制器操作不遵守 ValidateInput(false)?我认为至少,它至少可以让我进入我的页面。
最后,我会说我已阅读此内容并将 requestValidationMode 添加到我的站点,但现在他们的 ADFS 已关闭,因此在备份之前我无法验证它是否有任何作用。