如何解决"授权"是"System.Web.Mvc.Authorizeattribute"和"ProjectDefaultNamespace"之间的模糊引用?



如以下内容,我在项目默认名称空间中创建了一个AuthorizeAttribute类。因此,编译器将自动拾取它,而不是MVC的标准标准。但是它选择了System.Web.Mvc.Authorizeattribute

如果我包括我的项目名称空间,即using TestIdentitySample;,则显示以下错误

  'Authorize' is an ambiguous reference between 'System.Web.Mvc.Authorizeattribute' and 'ProjectDefaultNamespace'
  • 请注意,我不想使用完全合格的名称命名空间别名其他Custome属性名称

我的授权tribute类

namespace TestIdentitySample
{
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {
        protected override void HandleUnauthorizedRequest(System.Web.Mvc.AuthorizationContext filterContext)
        {
            if (filterContext.HttpContext.Request.IsAuthenticated)
            {
                filterContext.Result = new System.Web.Mvc.HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
            }
            else
            {
                base.HandleUnauthorizedRequest(filterContext);
            }
        }
    }
}

我只希望编译器会自动拾取它,而不是MVC的标准,如果可能的话。预先感谢您的任何帮助。

您应该重新考虑使用相同名称创建自己的属性的方法。这是有问题的,原因有两个:

  1. 代码的读者可能认为这是内置属性,而不是您自己的属性。他们可能会误解您的代码的作用。这对于AuthorizeAttribute尤其重要,因为安全是Web应用程序中通常的关键问题
  2. 您可能会遇到命名冲突。这正是这里发生的一切。

您可以以不同的方式解决您的问题:

重命名您的属性

一个很好的解决方案 - 我建议的解决方案就是简单地重命名您的自定义属性,以便很明显它是您的,命名冲突得到解决。

明确指定名称空间

如果要保留属性的相同名称,则可以通过明确指定自己的名称空间来解决命名冲突:

[ProjectDefaultNamespace.Authorize]

使用名称空间别名

您还可以在using列表中指定名称空间别名:

using MyAuthorizeAttribute = ProjectDefaultNamespace.AuthorizeAttribute;

然后像以下方式应用:

[MyAuthorizeAttribute]

但是,再说一次,为什么不只是给它自己的自定义名称呢?它将在代码中看起来相同,而没有别名的其他并发症。

相关内容

  • 没有找到相关文章