我们在ASP.NET MVC 4.5项目4已成功配置的Windows标识基础(WIF)与身份和访问...扩展为Visual Studio 2012的帮助,但无法排除授权特定的路径允许匿名访问。
当我们进入我们的默认路由(即/Home
),被动重定向将我们重定向到配置的发布者URI。 这是当期的。 但是,现在假设我们希望排除路径/Guest
从STS认证,使每个人都可以访问http://ourhost/Guest
没有beeing路由到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文件放到这个文件夹,但没有成功。 无论哪个开放的,我们定位在浏览器中,我们总是重定向。
什么是实现这一目标的正确方法?
编辑
删除了以前的“接受回答”,将“接受的答案”,以Eugenios答案 ,因为这是比较有用的回复。
在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。 一切工作与匿名访问。
注意:
你有太多的向导在此方面的控制(见向导的“配置”页)。
我不能让[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; } }
我是在同样的情况托马斯。 就我而言,我在测试/使用IISExpress本地。
欧亨尼奥的回答几乎让我的工作,有一个附加要求。 我在我的MVC项目属性设置“匿名身份验证”为“Enabled”。
这是无论是默认情况下禁用或可能使用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>
而且,我想补充的标准[授权]属性控制器,我想通过WIF辩护操作:
[Authorize]
public ActionResult About()
{
....
}
什么最后指出我到正确的方向是一个较旧的博客文章 ,解释如何保护页面的特定控制器或地区。 在全球过滤器组合我几乎没有。
好像关键是不要用passiveRedirectEnabled="true"
选项,但它设置为false
。 只有这样,你必须在认证过程中的完全控制,但需要触发自己被动重定向然后,使用SignInRequestMessage
类(这是不是一个大问题)。
需要较少的代码更好的解决方案是受欢迎的。
编辑
删除了“接受回答”状态这一点,将“接受的答案” Eugenios前面回答,因为这是比较有用的回复。