1

我有一个通过 Windows 身份验证保护的 Web 应用程序。但是,我有一个控制器需要在全球范围内可供任何人使用,因此他们不需要服务器上的 Windows 帐户来获得访问权限。

我通过在 IIS 中启用 Windows 身份验证和匿名身份验证来实现这一点。我的控制器现在看起来像这样:

[Authorize]
public class MyController : Controller
{
    public Index()
    {
    }

    public DoStuff()
    {
    }

    etc...
}

我的匿名控制器是相同的,只是我从一开始就删除了 [Authorise] 属性。

我是否正确地说这指示 Web 应用程序只允许那些拥有 Windows 帐户的用户使用大多数控制器,但我想允许匿名访问的控制器除外?

它似乎工作得很好,但我想确保这样做不会留下一个巨大的安全漏洞?

启用这两种身份验证方法并以这种方式设置应用程序是否有任何问题?

4

1 回答 1

0

首先,按照您的操作方式,您的应用程序的安全性没有漏洞,它将按照您预期的方式运行。但是有更好的方法...

Authorize 属性的问题是很容易忘记您添加到应用程序的新控制器,如果您不添加它,您的控制器对公众开放。

如果您使用的是 MVC 4,则可以将 Authorize 属性添加为全局过滤器,然后在匿名控制器上使用 AllowAnonymous 属性,因为 Authorize 属性默认尊重 AllowAnonymous 属性。另一方面,MVC 3 不附带 AllowAnonymous 属性。吨

解决方法是在您的项目中自己创建 AllowAnonymous 属性,如下所示:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public sealed class AllowAnonymousAttribute : Attribute { }

现在,您可以从内置的 Authorize 属性进行子类化以自定义该属性并查找应用于您的控制器的 Anonymous 属性。如果找到该属性,则可以跳过授权。这是一个示例实现:

public sealed class AuthorizeWithAnonymousSupportAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)
            || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true);
            if (!skipAuthorization)
            {
                base.OnAuthorization(filterContext);
            }
        }
    }

您必须将此属性添加到站点的全局过滤器中。在您的 Global.asax 中:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
    filters.Add(new AuthorizeWithAnonymousSupportAttribute ());
    filters.Add(new HandleErrorAttribute());
}

现在,最后一步。您可以简单地将 AllowAnonymous 属性添加到您想要匿名的任何控制器:

[AllowAnonymous]
public class MyController : Controller
{
    public Index()
    {
    }

    public DoStuff()
    {
    }

    etc...
}

执行上述所有操作的好处是您不必担心将 Authorize 属性添加到您添加到应用程序的控制器中。相反,您必须明确告诉应用程序哪些控制器对公众开放。

谢谢,希望这会有所帮助。

于 2012-10-04T20:09:05.803 回答