WSFederationAuthenticationModule: RedirectToIdentityProvider



像许多其他在.NET中处理WIF的人一样,我遇到了常见的错误:

ID3206:登录响应消息只能在当前 网络应用程序。

编写了一个自定义身份验证模块,其中我按照错误 - SignInResponse 消息只能在当前 Web 应用程序 - MVC 2.0 应用程序中重定向中的建议覆盖了重定向到身份提供程序。

建议的代码示例没有考虑到请求 URL 可能包含参数,即它只会将尾部斜杠附加到完整的 URL。最终,我将代码扩展到您在下面看到的代码,但仍然使用该领域来决定是否处理URL:

Public Overrides Sub RedirectToIdentityProvider(ByVal uniqueId As String, ByVal returnUrl As String, ByVal persist As Boolean)
    Dim absoluteUri As String = HttpContext.Current.Request.Url.AbsoluteUri
    Dim ciAbsoluteUri As String = absoluteUri.ToLowerInvariant
    Dim realm As String = MyBase.Realm
    Dim ciRealm As String = realm.ToLowerInvariant
    'If Realm ends with a trailing slash, the returnUrl should include a trailing slash in the same position.
    'This trailing slash may or may not be the end of the returnUrl, depending on whether or not additional parameters have been provided.
    If realm.EndsWith("/") Then
        If Not ciAbsoluteUri.StartsWith(ciRealm) Then
            Dim realmWithoutSlash As String = realm.Substring(0, realm.Length - 1)
            Dim ciRealmWithoutSlash As String = realmWithoutSlash.ToLowerInvariant
            If ciAbsoluteUri.StartsWith(ciRealmWithoutSlash) Then
                'Realm ends with a slash and AbsoluteUri contains Realm but without a slash.
                Dim absolutePath As String = HttpContext.Current.Request.Url.AbsolutePath
                returnUrl = returnUrl.Replace(absolutePath, absolutePath & "/")
            End If
        End If
    End If
    MyBase.RedirectToIdentityProvider(uniqueId, returnUrl, persist)
End Sub

(这本可以写得更紧凑,但这不是重点。

原始帖子中的代码包括以下注释

//Compare if Request Url +"/" is equal to the Realm, so only root access is corrected
//https://localhost/AppName plus "/" is equal to https://localhost/AppName/
//This is to avoid MVC urls

完全可以将 web.config 文件中的领域和受众 URI 以及 AD FS 2.0 端的标识符设置为请求 URL 的子集以外的其他内容,只要该值是有效的 URI。例如,"http://corp.com"的虚假值就足够了。但是,使用此类值意味着重定向到身份提供程序覆盖不会处理请求 URL。

我的问题是:

MVC 应用程序中将领域作为请求 URL 的子集的原因是什么,更重要的是,是否有理由要求非 MVC 应用程序具有相同的权限?

我不能忽略领域并确保 URL 在末尾(在没有参数的情况下(或参数列表之前包含一个斜杠吗?

只是一些基础知识:Realm 是元数据中 EntityID 的 WIF 语言。它应该是一个 URI。这意味着它不必是 URL。几乎所有的实现都非常宽容,并且接受 EntityID 中的任何字符串。
在这种情况下,返回网址是指在用户通过身份验证并且 WIF 设置了会话 cookie 后浏览器将转到的 URL。它应该在应用程序中(否则为什么要进行身份验证(。如果你真的想要应用程序根目录,那么结尾斜杠确实是一个好主意(因为cookiepath(。因此,Realm 的使用(在这种特殊情况下(是一个错误。

相关内容

  • 没有找到相关文章

最新更新