我们已经在Visual Studio 2012的 Identity and Access ... 扩展的帮助下,在ASP.NET 4.5 MVC 4项目中成功配置了Windows身份基础(WIF)。但是无法从授权中排除特定路径以允许匿名访问。
当我们访问默认路由(即/Home
)时,被动重定向会将我们重定向到配置的颁发者Uri。这是当前的。但现在假设我们要从STS身份验证中排除路径/Guest
,以便每个人都可以访问http://ourhost/Guest
而无需路由到STS颁发者。只有静态文档位于那里。
来自Web.config
的小部件:
<system.identityModel>
<identityConfiguration>
<audienceUris>
<add value="http://ourhost/" />
</audienceUris>
<issuerNameRegistry type="System.IdentityModel.Tokens.ConfigurationBasedIssuerNameRegistry, System.IdentityModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<trustedIssuers>
<add thumbprint="9B74****40D0" name="OurSTS" />
</trustedIssuers>
</issuerNameRegistry>
<certificateValidation certificateValidationMode="None" />
</identityConfiguration>
</system.identityModel>
<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" />
<wsFederation passiveRedirectEnabled="true" issuer="http://oursts/Issue" realm="http://ourhost/" reply="http://ourhost/" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>
我们还有......
<system.webServer>
<!-- ... -->
<modules runAllManagedModulesForAllRequests="true">
<add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<remove name="FormsAuthentication" />
</modules>
</system.webServer>
最后:
<system.web>
<!-- ... -->
<authentication mode="None" />
</system.web>
我们尝试了以下但没有成功:
<location path="~/Guest"> <!-- also "/Guest" is not working -->
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
</location>
我们还尝试将一个小的Web.config文件放入此文件夹,但没有成功。无论我们在浏览器中找到哪个Uri,我们都会重定向。
实现这个目标的正确方法是什么?
修改
删除了之前的#34;已接听的答案&#34;,设置了#34;已接受的答案&#34;至Eugenios answer,因为这是更有用的回复。
答案 0 :(得分:12)
在MVC应用程序中,您通常通过控制器和操作中的[Authorize]
属性定义访问权限。
只需从web.config中删除:
<system.web>
<authorization>
<deny users="?" />
</authorization>
注意:这通常由VS2010中的“添加STS参考”向导自动添加
似乎VS2012和新工具的行为完全相同。我刚刚创建了一个全新的MVC4应用程序。使用本地配置STS(保留所有默认值)运行“身份和访问...”工具。
它确实将此片段添加到web.config:
<authorization>
<deny users="?" />
</authorization>
我将其删除并将[Authorize]
添加到“关于控制器”操作:
[Authorize]
public ActionResult About()
{
ViewBag.Message = "Your app description page.";
return View();
}
当我点击“关于”链接时,我会被重定向到STS。其他一切都与匿名访问有关。
注意:
您也可以在向导中对此进行控制(请参阅向导的“配置”页面)。
答案 1 :(得分:4)
我无法让[Authorize]
工作 - 它没有重定向到我的STS,我相信这是我所缺少的。不过,我确实发现了如何解决原始问题。
在 global.asax
:
protected void Application_Start() { ... config stuff ... FederatedAuthentication.WSFederationAuthenticationModule.AuthorizationFailed += WSFederationAuthenticationModule_AuthorizationFailed; }
然后:
void WSFederationAuthenticationModule_AuthorizationFailed(object sender, AuthorizationFailedEventArgs e) { // Do path/file detection here if (Request.Path.Contains("/Content/") || Request.Path.Contains("/Scripts/")) { e.RedirectToIdentityProvider = false; } }
答案 2 :(得分:2)
最终指向正确方向的是较早的 blog post ,它解释了如何保护特定控制器或页面区域。结合全局过滤器,我几乎就在那里。
似乎关键是不要使用passiveRedirectEnabled="true"
选项,而是将其设置为false
。只有这样你才能完全控制身份验证过程,但是需要自己使用SignInRequestMessage
类来自动触发被动重定向(这不是什么大问题)。
欢迎使用更少代码的更好解决方案。
修改强>
为此删除了“已接受回答”状态,为Eugenios anwer设置了“已接受答案”,因为这是更有用的回复。
答案 3 :(得分:2)
我和托马斯的情况相同。就我而言,我在本地测试/使用IISExpress。
Eugenio的答案几乎让我工作,增加了一项要求。我必须将我的MVC项目属性中的“匿名身份验证”设置为“已启用”。
默认情况下禁用此功能,或者在使用VS 2012“身份和访问...”工具时可能设置此方式。
因此,回顾一下,没有代码或特殊属性可以编写/维护。
我的csproj文件包含:
<IISExpressAnonymousAuthentication>enabled</IISExpressAnonymousAuthentication>
我的web.config包含:
<system.web>
<authentication mode="None" />
</system.web>
<system.web>
<authorization>
<allow users="*" />
</authorization>
</system.web>
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
<add name="WSFederationAuthenticationModule" type="System.IdentityModel.Services.WSFederationAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
<add name="SessionAuthenticationModule" type="System.IdentityModel.Services.SessionAuthenticationModule, System.IdentityModel.Services, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" preCondition="managedHandler" />
</modules>
</system.webServer>
<system.identityModel.services>
<federationConfiguration>
<wsFederation passiveRedirectEnabled="true" issuer="https://REMOVED.accesscontrol.windows.net/v2/wsfederation" realm="urn:REMOVED" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>
并且,我将标准[Authorize]属性添加到我希望由WIF保护的控制器操作中:
[Authorize]
public ActionResult About()
{
....
}