我对WIF完全陌生,为了开始玩它,我尝试了最简单的"f5体验"与MVC4应用程序;根据我找到的教程,遗憾的是大部分都是指。net 4.5之前的版本,我应该创建一个MVC应用程序,用身份和访问工具配置它,然后按f5启动并运行本地STS。然而,我可能错过了一些明显的东西,因为当我试图访问一个受限制的页面时,我总是最终撞回主页。
这就是我所做的,你可以很容易地再现这些步骤的问题(VS2012在Win8与WIF SDK;确保以管理员权限启动VS):
-
创建一个新的ASP。NET MVC4 Internet应用程序。将其端口设置为7777(为了方便使用,只选择大多数代码示例中使用的端口号)。
-
更新所有的NuGet包。
-
右键单击解决方案,选择身份和访问,设置IP=本地STS,然后单击确定。然后重新打开身份和访问窗口,选择"生成控制器",然后单击"确定"。
-
为Home控制器的About动作添加一个[authorization]属性
-
按F5,点击About链接。正如预期的那样,出现了登录视图,提示我登录:唯一的选择当然是localSTS。当我单击它时,我返回到主页,没有进行身份验证。我可以重复这个过程,但没有任何变化,所以我永远无法访问安全的About页面。
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
当然,它的参数看起来不错。
如果我检查网络流量,我看不到任何相关的项(如果我理解得好,我希望响应为当前会话设置一些cookie,代表iclaimprincipal)。
(顺便说一句,通过查看网络。我可以看到,在模块中,WSFederationAuthenticationModule是从System.Identity引用的。服务,在配置身份和访问后不包含在解决方案中;我想这是这个工具的一个bug。无论如何,我添加了一个参考,但没有改变。
更新谢谢你的回复!如果我检查流量,这里是相关的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链接来有效地进入页面。
我复制了您的步骤,一切正常。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的结果是Set-Cookie命名为FedAuth1和FedAuth1。由于Cookie大小限制,Cookie被分割。
请在调试器中检查。
注。有一次我看到了同样的行为- cookie没有正常设置。问题是在cookie大小,并通过切换到ReferenceMode解决。不要忘记在Application_Start:
中注册它FederatedAuthentication.WSFederationAuthenticationModule.SessionSecurityTokenCreated
+= this.WSFederationAuthenticationModule_SessionSecurityTokenCreated;