我对 WIF 完全陌生,刚开始玩它,我尝试了一个 MVC4 应用程序的最简单的“f5 体验”;根据我找到的教程,遗憾的是大部分是指 .net 4.5 之前的版本,我应该只创建一个 MVC 应用程序,使用身份和访问工具对其进行配置,然后按 f5 启动并使用本地 STS 运行。然而,我可能遗漏了一些明显的东西,因为当我尝试访问受限制的页面时,我总是最终撞回主页。
这是我所做的,您可以通过这些步骤轻松重现问题(Win8 中的 VS2012 和 WIF SDK;确保以管理员权限启动 VS):
创建一个新的 ASP.NET MVC4 Internet 应用程序。将其端口设置为 7777(为了方便起见,仅选择大多数代码示例中使用的端口号)。
更新所有 NuGet 包(这是可选的)。
右键单击解决方案,选择身份和访问并设置 IP=本地 STS,然后单击确定。然后重新打开身份和访问弹出窗口,并选择生成控制器,然后单击确定。
将 [Authorize] 属性添加到 Home 控制器的 About 操作。
按 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链接,有效进入页面。