为 IIS 7 经典模式错误配置联合被动依赖方(无法执行 URL)
Posted
技术标签:
【中文标题】为 IIS 7 经典模式错误配置联合被动依赖方(无法执行 URL)【英文标题】:Configuring federated passive Relying Party for IIS 7 classic mode error (Failed to Execute URL) 【发布时间】:2012-06-09 19:05:44 【问题描述】:我有一个 ASP.Net 依赖方,它使用 Microsoft 身份模型和 WIF 来实现被动联合身份。 Web 应用程序在 .Net 4 集成管道应用程序池下的 IIS 7 中运行良好。但是当我将它切换到 .Net 4 经典管道应用程序池时,它失败并给我以下错误。如何解决这个问题?
异常详情: System.Web.HttpException:执行 URL 失败。
堆栈跟踪:
[HttpException (0x80004005): 执行 URL 失败。] System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.BeginExecuteUrl(字符串 url,字符串方法,字符串 childHeaders,布尔 sendHeaders,布尔 addUserIndo,IntPtr 令牌,字符串名称,字符串 authType,字节 [] 实体,AsyncCallback cb,对象状态)+4040320 System.Web.HttpResponse.BeginExecuteUrlForEntireResponse(字符串路径覆盖,NameValueCollection requestHeaders,AsyncCallback cb,对象状态)+590 System.Web.DefaultHttpHandler.BeginProcessRequest(HttpContext 上下文,AsyncCallback 回调,对象状态)+286 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +405 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375
编辑
当我在未指定页面的情况下浏览网站时会发生此错误。示例:
1 - http://www.relyingparty3.com 导致错误
2 - http://www.relyingparty3.com/Default.aspx 工作正常
【问题讨论】:
【参考方案1】:我在以下 MSDN 论坛帖子中找到了解决方案。归功于用户“paullem”(解释失败的原因)和“Alex Stankiewicz”(用于提供修复代码):
http://social.msdn.microsoft.com/Forums/en/Geneva/thread/43392dc5-e764-4027-8de5-1638a4c17540
所以为了解决这个问题,我用以下代码创建了一个新类:
using System;
using System.Web;
using System.Security.Principal;
using System.Threading;
using Microsoft.IdentityModel.Claims;
using Microsoft.IdentityModel.Web;
namespace TestApp.Code
public class IIS6SessionAuthenticationModule : SessionAuthenticationModule
protected override void OnPostAuthenticateRequest(object sender, EventArgs e)
if (!(HttpContext.Current.User is IClaimsPrincipal))
IClaimsPrincipal incomingPrincipal = ClaimsPrincipal.CreateFromHttpContext(HttpContext.Current);
ClaimsAuthenticationManager manager = base.ServiceConfiguration.ClaimsAuthenticationManager;
if (((manager != null) && (incomingPrincipal != null)) && (incomingPrincipal.Identity != null))
incomingPrincipal = manager.Authenticate(HttpContext.Current.Request.Url.AbsoluteUri, incomingPrincipal);
if (incomingPrincipal.Identity.IsAuthenticated)
HttpContext.Current.User = incomingPrincipal;
Thread.CurrentPrincipal = incomingPrincipal;
else
HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(string.Empty), new string[] );
Thread.CurrentPrincipal = HttpContext.Current.User;
else
if (string.IsNullOrEmpty(HttpContext.Current.User.Identity.Name))
HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(string.Empty), new string[] );
Thread.CurrentPrincipal = HttpContext.Current.User;
然后,我将以下条目添加到“web.config”中“system.web”的“httpModules”中,在“WSFederationAuthenticationModule”和“SessionAuthenticationModule”之后:
<add name="IIS6SessionAuthenticationModule" type="TestApp.Code.IIS6SessionAuthenticationModule, TestApp" />
【讨论】:
【参考方案2】:尾随斜杠有问题。
如果你输入:http://www.relyingparty3.com/会发生什么
(注意斜线)
【讨论】:
当我输入 relyingparty3.com 时,它会更改为 relyingparty3.com,我得到同样的错误。以上是关于为 IIS 7 经典模式错误配置联合被动依赖方(无法执行 URL)的主要内容,如果未能解决你的问题,请参考以下文章
IIS 7 托管管道模式 经典模式(Classic) 集成模式(Integrated) 分析与理解