WSFederationAuthenticationModule.IsSignInResponse中的潜在危险Request.Form

时间:2011-03-26 16:15:06

标签: asp.net-mvc-3 wif

在我的MVC3网站中,我避免使用新的ValidateInput属性设置requestValidationMode =“2.0”,但现在我正在尝试切换到WIF进行身份验证,当STS重定向回我的网站时,我收到了异常,因为WSFederationAuthenticationModule.IsSignInResponse正在调用Request.Form而不是Request.Unvalidated().Form ...有没有办法处理这个问题而不需要requestValidationMode =“2.0”(我真的不想这样做)做)。

这是堆栈跟踪,所以你可以看到我的意思。我的控制器的方法永远不会被调用。

[HttpRequestValidationException (0x80004005): A potentially dangerous Request.Form value was detected from the client (wresult="<trust:RequestSecuri...").]
   System.Web.HttpRequest.ValidateString(String value, String collectionKey, RequestValidationSource requestCollection) +8755668
   System.Web.HttpRequest.ValidateNameValueCollection(NameValueCollection nvc, RequestValidationSource requestCollection) +122
   System.Web.HttpRequest.get_Form() +114
   Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.IsSignInResponse(HttpRequest request) +21
   Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.CanReadSignInResponse(HttpRequest request, Boolean onPage) +121
   Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnAuthenticateRequest(Object sender, EventArgs args) +78
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

2 个答案:

答案 0 :(得分:12)

处理此问题的正确方法是向HttpRuntime添加特定验证器,该验证器知道如何检测有效的安全令牌。

请查看此处的任何示例:http://claimsid.codeplex.com/releases/view/62929

以下是其中一个的摘录(示例#5是具体的,也是MVC应用程序):

namespace FShipping
{
    using System;
    using System.Web;
    using System.Web.Util;
    using Microsoft.IdentityModel.Protocols.WSFederation;

    public class WsFederationRequestValidator : RequestValidator
    {
        protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex)
        {
            validationFailureIndex = 0;
            if (requestValidationSource == RequestValidationSource.Form &&
                collectionKey.Equals(WSFederationConstants.Parameters.Result, StringComparison.Ordinal))
            {
                if (WSFederationMessage.CreateFromFormPost(context.Request) as SignInResponseMessage != null)
                {
                    return true;
                }
            }

            return base.IsValidRequestString(context, value, requestValidationSource, collectionKey, out validationFailureIndex);
        }
    }
}

这是配置:

<system.web> 
...   
   <httpRuntime requestValidationType="FShipping.WsFederationRequestValidator" />
</system.web>

答案 1 :(得分:2)

我认为我们在某些时候也观察到了同样的错误,但如果我没记错,那是在一些实验或测试脚手架代码中,所以我们没有严格的安全要求。

我能找到的官方信息是这是WIF中的一个已知问题:请参阅the WIF Known Issues page开头的“ASP.NET检测被动联合令牌作为潜在的安全攻击”部分。他们说要在validateRequest="false"中设置web.config,或者在页面级别设置等效的ASP.NET Page指令。

所以你可以尝试在应用程序的“主页”上的Page指令中设置它,我不确定,但这可能有效。

请注意,他们不会在WIF已知问题页面上讨论requestValidationMode="2.0",但从this TechNet wiki page判断,此附加设置对于ASP.NET 4是必需的。

相关问题