0

我对 WIF 完全陌生,刚开始玩它,我尝试了一个 MVC4 应用程序的最简单的“f5 体验”;根据我找到的教程,遗憾的是大部分是指 .net 4.5 之前的版本,我应该只创建一个 MVC 应用程序,使用身份和访问工具对其进行配置,然后按 f5 启动并使用本地 STS 运行。然而,我可能遗漏了一些明显的东西,因为当我尝试访问受限制的页面时,我总是最终撞回主页。

这是我所做的,您可以通过这些步骤轻松重现问题(Win8 中的 VS2012 和 WIF SDK;确保以管理员权限启动 VS):

  1. 创建一个新的 ASP.NET MVC4 Internet 应用程序。将其端口设置为 7777(为了方便起见,仅选择大多数代码示例中使用的端口号)。

  2. 更新所有 NuGet 包(这是可选的)。

  3. 右键单击解决方案,选择身份和访问并设置 IP=本地 STS,然后单击确定。然后重新打开身份和访问弹出窗口,并选择生成控制器,然后单击确定。

  4. 将 [Authorize] 属性添加到 Home 控制器的 About 操作。

  5. 按 F5 并单击关于链接。不出所料,登录视图出现,提示我登录:唯一的选择当然是 localSTS。当我点击它时,我返回到主页并且没有进行身份验证。我可以重复这个过程,但没有任何改变,所以我永远无法访问受保护的关于页面。

localSTS 锚点下的链接是:

http://localhost:14743/wsFederationSTS/Issue?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a7777%2f&wctx=rm%3d0%26id%3d664ff3c2-95b1-40b3-b538-a8357233ea7e%26ru%3dhttp%253a%252f%252flocalhost%253a7777%252f&wct=2013-03-10T13%3a39%3a32Z

AFAIK,它的参数看起来不错。

如果我检查网络流量,我看不到任何相关项目(如果我理解得很好,我希望响应为当前会话设置一些 cookie,代表 IClaimsPrincipal)。

(顺便说一句,通过查看 web.config,我可以看到在模块中 WSFederationAuthenticationModule 是从System.Identity.Services引用的,在配置身份和访问权限后,它不包含在解决方案中;我想这是工具中的一个错误。无论如何,我添加了对它的引用,但没有任何改变。)

更新

感谢您的答复!如果我检查流量,这里是相关的 GET/POST。我没有饼干。我尝试重新创建整个测试解决方案,甚至跳过上面的步骤 #2 以使其最小化,但没有任何改变。

至于您的建议#2,我尝试添加全局 asax:

        FederatedAuthentication.WSFederationAuthenticationModule.SecurityTokenValidated
            += (sender, e) => FederatedAuthentication.SessionAuthenticationModule.IsReferenceMode = true;

但是 SessionAuthenticationModule 在此代码执行时为空,因此引发了相应的异常。我找不到关于此的最新代码示例或文章,但 WIF 似乎是一项非常有前途的技术;我希望像我这样的安全新手可以轻松使用它;我的主要目的是将它应用于提供 MVC 控制器和 WebApi 控制器的站点,适用于广泛的消费者(JS 代码、移动应用程序、WinRT 应用程序、站点页面本身......)。有什么建议吗?

(1) a GET which gets 307, temporary redirect

GET /wsFederationSTS/Issue?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a7777%2f&wctx=rm%3d0%26id%3d664ff3c2-95b1-40b3-b538-a8357233ea7e%26ru%3dhttp%253a%252f%252flocalhost%253a7777%252f&wct=2013-03-10T13%3a39%3a32Z HTTP/1.1
Host: localhost:14743
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22
Referer: http://localhost:7777/HrdAuthentication/Login?ReturnUrl=%2fHome%2fAbout
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: 

(2) GET with signin request:
GET /wsFederationSTS/Issue/?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a7777%2f&wctx=rm%3d0%26id%3d664ff3c2-95b1-40b3-b538-a8357233ea7e%26ru%3dhttp%253a%252f%252flocalhost%253a7777%252f&wct=2013-03-10T13%3a39%3a32Z HTTP/1.1
Host: localhost:14743
Connection: keep-alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22
Referer: http://localhost:7777/HrdAuthentication/Login?ReturnUrl=%2fHome%2fAbout
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: 

(3) a POST to the homepage: the respone is of course the homepage content; no cookies set.
POST / HTTP/1.1
Host: localhost:7777
Connection: keep-alive
Content-Length: 7063
Cache-Control: max-age=0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Origin: http://localhost:14743
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.160 Safari/537.22
Content-Type: application/x-www-form-urlencoded
Referer: http://localhost:14743/wsFederationSTS/Issue/?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a7777%2f&wctx=rm%3d0%26id%3d664ff3c2-95b1-40b3-b538-a8357233ea7e%26ru%3dhttp%253a%252f%252flocalhost%253a7777%252f&wct=2013-03-10T13%3a39%3a32Z
Accept-Encoding: gzip,deflate,sdch
Accept-Language: en-US,en;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3
Cookie: 

工作变化

我找到了让它工作的方法,也许这对其他人有用:如果您按照上述过程而不从本地 IIS 服务器更改为 VS 开发服务器,它似乎正在工作,我仍然被重定向到主页页面(我想知道为什么:),但是作为经过身份验证的用户;此时,我可以再次点击About链接,有效进入页面。

4

1 回答 1

0

我重现了您的步骤,一切正常。Chrome调试器显示你必须有两个步骤:

GET  http://localhost:12263/wsFederationSTS/Issue/?wa=wsignin1.0&wtrealm=http%3a%2f%2flocalhost%3a54306%2f&wctx=rm%3d0%26id%3dc6e46b99-417b-49b6-96a0-40efcead898f%26ru%3dhttp%253a%252f%252flocalhost%253a54306%252f&wct=2013-03-10T18%3a14%3a19Z
POST http://localhost:54306/ with wa:wsignin1.0 and wresult:trust:RequestSecurityTokenResponseCollection

POST 的结果是名为 FedAuth 和 FedAuth1 的 Set-Cookie。由于 cookie 大小限制,cookie 被拆分。

请在调试器中检查。

ps 一旦我看到相同的行为 - cookie 未正常设置。问题在于 cookie 大小,并通过切换到 ReferenceMode解决。不要忘记在 Application_Start 中注册它:

FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated 
+= this.WSFederationAuthenticationModule_SessionSecurityTokenCreated;
于 2013-03-10T18:41:26.120 回答