从ASP.NET MVC 4项目中排除WIF授权的特定路径

时间:2012-11-08 10:09:11

标签: asp.net-mvc asp.net-mvc-4 wif claims-based-identity

我们已经在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,因为这是更有用的回复。

4 个答案:

答案 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()
{
....
}