【问题标题】:Can I bypass organizational authentication for a WebAPI controller inside an MVC app?我可以绕过 MVC 应用程序内 WebAPI 控制器的组织身份验证吗?
【发布时间】:2015-01-27 22:07:08
【问题描述】:

我有一个使用组织身份验证 (Azure AD) 的 MVC5、EF6 应用程序,除了一件事外,一切正常。 WebAPI 控制器需要处理来自未经身份验证的客户端的请求。客户端通常是发出 AJAX 请求的 Android 设备。

在我向我的 MVC 应用程序添加组织身份验证之前,我的 WebAPI 控制器被调用并正常运行,因此我知道我的路由是正确的。现在我添加了组织身份验证,不再调用我的 WebAPI 控制器,并且客户端的 AJAX 请求超时。

我知道有诸如 [Authorize] 之类的属性来指定对控制器/方法的访问,但是在使用组织身份验证时,似乎没有 [Authorize] 属性的 WebAPI 控制器不会被调用。

我的问题是,我可以将我的 WebAPI 控制器标记为允许来自未经身份验证的客户端的请求吗?如果可以,我该怎么做?

非常感谢。

【问题讨论】:

  • 您是否有任何委托处理程序来处理 Web api 应用程序中的授权?
  • 不,我没有。我找到了解决方案,它在下面列出,但我还不能将其标记为官方答案,需要再等 23 小时!解决方案是在 web.config 文件中添加一个位置条目。详情见答案。

标签: c# asp.net-mvc authentication azure asp.net-web-api


【解决方案1】:

答案是通过将下面的 xml 输入到根 Web.config 文件中来允许匿名连接到特定控制器。

如果您的控制器名为“PersonController”,那么您应该在路径属性中输入的名称是“person”而不是“personcontroller”。

在我的例子中,因为我想允许对 WebAPI 控制器的匿名请求,所以我需要在路径属性中为我的控制器名称添加前缀“api/”。

希望这对可能遇到相同问题的其他人有所帮助。

<location path="api/my-controller-name">
  <system.web>
    <authorization>
      <allow users="?" />
    </authorization>
  </system.web>
</location>

【讨论】:

  • 我补充说,路由应该覆盖api文件夹,控制器名称应该放在没有完整文件路径的地方。 Reshaper 会建议你更多...
【解决方案2】:

如果您想允许匿名访问,您可以使用[AllowAnonymous] 属性。

您可以将其添加到 ApiController 上方,以标记整个控制器以进行匿名访问,例如:

[AllowAnonymous]
public class MyApiController : ApiController
{
}

或者你可以给一个特定的方法这个属性,以允许该方法被匿名调用:

[Authorize]
public class MyApiController : ApiController
{
    [AllowAnonymous]
    public string GetData() 
    {

    }
}

这将在用户未被授权时阻止对所有方法的访问,除了可以匿名调用的GetData() 方法。

【讨论】:

  • 谢谢,我试过了,但它在组织身份验证上下文中不起作用。我认为问题发生在属性生效之前,因为如果我将 WebAPI 方法的 URL 粘贴到浏览器地址栏中,我会被重定向到 Microsoft 登录页面。
猜你喜欢
  • 2015-08-04
  • 1970-01-01
  • 2013-06-19
  • 2012-12-23
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2016-03-19
  • 1970-01-01
相关资源
最近更新 更多