排除来自WIF授权特定的路径在ASP.NET MVC 4项目(Exclude specific pa

2019-08-02 11:32发布

我们在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答案 ,因为这是比较有用的回复。

Answer 1:

在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。 一切工作与匿名访问。

注意:

你有太多的向导在此方面的控制(见向导的“配置”页)。



Answer 2:

我不能让[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; } } 


Answer 3:

我是在同样的情况托马斯。 就我而言,我在测试/使用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()
{
....
}


Answer 4:

什么最后指出我到正确的方向是一个较旧的博客文章 ,解释如何保护页面的特定控制器或地区。 在全球过滤器组合我几乎没有。

好像关键是不要用passiveRedirectEnabled="true"选项,但它设置为false 。 只有这样,你必须在认证过程中的完全控制,但需要触发自己被动重定向然后,使用SignInRequestMessage类(这是不是一个大问题)。

需要较少的代码更好的解决方案是受欢迎的。

编辑

删除了“接受回答”状态这一点,将“接受的答案” Eugenios前面回答,因为这是比较有用的回复。



文章来源: Exclude specific path from WIF authorization in a ASP.NET MVC 4 project