为什么AllowAnonymous在部署到Azure网站时不起作用?

时间:2013-07-02 15:39:43

标签: asp.net-mvc asp.net-mvc-4 authorization

我有一个带有以下控制器的MVC4网络应用程序

[Authorize]
public class AccountController : BaseController
{
  [AllowAnonymous]
  public ActionResult SignInRegister(LoginModel loginModel, string returnUrl)
  {
    //some implementation
  }
  //other secured actions
}

这在本地运行时按预期工作,但只要我将其部署到Free Azure网站,我就会收到401错误代码,其中包含以下消息:You do not have permission to view this directory or page.

删除[Authorize]属性并重新部署按预期工作,再次添加并重新部署会带来问题。

我甚至尝试过完全限定的类名:System.Web.Mvc.AuthorizeSystem.Web.Mvc.AllowAnonymous,结果相同。

该应用程序使用的是.NET 4.5,Azure网站也配置为使用4.5。

更新 BaseController有一个操作,将标题作为部分视图返回,但未使用[AllowAnonymous]修饰。在本地,它导致页面显示没有标题,但在Azure网站上,响应被切断,只返回上面提到的错误消息。在我故意调查它之前,我没有意识到标题丢失了。

现在问题有待提出:为什么Azure网站会覆盖响应?

3 个答案:

答案 0 :(得分:4)

BaseController有一个动作,它将Header作为部分视图返回,该视图未使用[AllowAnonymous]进行修饰。在本地,它导致页面显示没有标题,但在Azure网站上,响应被切断,只返回上面提到的错误消息。在我故意调查它之前,我没有意识到标题丢失了。

现在问题有待提出:为什么Azure网站会覆盖响应?

答案 1 :(得分:2)

我遇到了完全相同的问题,就像Jonas的更新说的那样,你需要注意返回部分视图并具有[Authorize]属性的Actions。

您需要做的是删除[Authorize]属性,然后如果您的操作需要对用户进行身份验证才能正确呈现,请让您的代码处理未经授权的案例。

示例是您的页面是否通过Partial显示当前登录的用户名。如果当前登录的用户不可用,请让您的操作显示空字符串或其他内容。

答案 2 :(得分:1)

如果您有

,请检查您的web.config
<authorization>
  <deny users="?" />
</authorization>

其覆盖[AllowAnonymous]

添加到web.config部分:

<location path="YourController/AnonymousMethod">
    <system.web>
      <authorization>
        <allow users="*"/>
      </authorization>
    </system.web>
  </location>

允许匿名访问AnonymousMethod