【问题标题】:MVC 3 anoNynmous and Windows authentication combinedMVC 3 anNynmous 和 Windows 身份验证相结合
【发布时间】:2012-10-04 16:09:25
【问题描述】:

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

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

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

    public DoStuff()
    {
    }

    etc...
}

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

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

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

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

【问题讨论】:

    标签: asp.net-mvc windows-authentication anonymous integrated


    【解决方案1】:

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

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

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

    解决方法是在您的项目中自己创建 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 属性添加到您添加到应用程序的控制器中。相反,您必须明确告诉应用程序哪些控制器对公众开放。

    谢谢,希望对您有所帮助。

    【讨论】:

    • 非常感谢您的明确解释。我会考虑在不久的将来如何设置它。
    猜你喜欢
    • 2015-07-18
    • 2012-01-13
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多