11

在 Visual Studio 2012 的Identity and Access...扩展的帮助下,我们已经在 ASP.NET 4.5 MVC 4 项目中成功配置了 Windows Identity Foundation (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,我们总是被重定向。

实现此目的的正确方法是什么?

编辑

删除了之前的“已接受回答”,将“已接受回答”设置为Eugenios 回答,因为这是更有用的回答。

4

5 回答 5

12

[Authorize]在 MVC 应用程序中,您通常通过控制器和操作中的属性定义访问权限。

只需从 web.config 中删除:

<system.web>
     <authorization>
        <deny users="?" />
      </authorization>

注意:这通常是由VS2010 中的“添加 STS 引用”向导自动添加的

似乎在 VS2012 和新工具上的行为完全相同。我刚刚创建了一个全新的 MVC4 应用程序。使用本地配置 STS 运行“身份和访问...”工具(保留所有默认值)。

它确实将此片段添加到 web.config:

<authorization>
  <deny users="?" />
</authorization>

我将其删除并添加[Authorize]到 About 控制器操作中:

[Authorize]
public ActionResult About()
{
    ViewBag.Message = "Your app description page.";

    return View();
}

当我点击“关于”链接时,我会被重定向到 STS。其他一切都适用于匿名访问。

笔记:

您也可以在向导中对此进行一些控制(参见向导的“配置”页面)。

于 2012-11-08T19:38:09.973 回答
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;
        }
    }
于 2014-09-21T11:33:22.293 回答
2

最终为我指明了正确方向的是一篇较早的博客文章,该文章解释了如何保护页面的特定控制器或区域。结合全局过滤器,我几乎就在那里。

似乎关键不是使用该passiveRedirectEnabled="true"选项,而是将其设置为false. 只有这样您才能完全控制身份验证过程,但需要自己触发被动重定向,使用SignInRequestMessage类(这没什么大不了的)。

欢迎使用更少代码的更好解决方案。

编辑

为此删除了“已接受回答”状态,将“已接受回答”设置为 Eugenios anwer,因为这是更有用的回复。

于 2012-11-09T08:24:06.550 回答
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()
{
....
}
于 2013-03-06T15:01:19.943 回答
0

我在 web.config 中解决了这个问题,第一行允许所有未经授权的用户,第二行禁用重定向

 <wsFederation passiveRedirectEnabled="false" issuer="xxx" realm="xxx"/>

<authentication mode="Windows" />
  <authorization>
      <allow users="*" />
  </authorization>
于 2022-01-25T17:51:56.517 回答