如何根据条件使用属性。 (通过标志禁用)

时间:2019-02-24 10:01:17

标签: c# asp.net-web-api2 custom-attributes

我正在使用“授权” 来自:System.Web.Http

基本控制器的属性。

问题是我需要根据条件使用它。

(例如,我有不需要身份验证/授权的模式)。

我如何实现它?

谢谢。

2 个答案:

答案 0 :(得分:1)

一种好的方法是覆盖AuthorizeAttribute,并在其中添加自定义逻辑。 这里有两种情况,以防您想与MVC控制器一起使用它来覆盖AuthorizeCore()方法并使用System.Web.Mvc命名空间的情况,如下所示:

public class MyCustomAuthorizeAttribute: AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        bool isExceptionalCase = GetIfExceptional();//Assuming here where you look for some other condition other than user is authorized
        if (!isExceptionalCase && !authorized)
        {
            // The user is not authorized => no need to go any further
            return false;
        }

        return true;
    }
}

第二种情况,在您的情况下,您将通过WebApi控制器使用它,您可以改写IsAuthorized()并使用System.Web.Http名称空间:

public class MyCustomAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        var authorized = base.IsAuthorized(actionContext);
        bool isExceptionalCase = GetIfExceptional();//Assuming here where you look for some other condition other than user is authorized
        if (!isExceptionalCase && !authorized)
        {
            // The user is not authorized => no need to go any further
            return false;
        }

        return true;
    }
}

然后在操作或控制器上使用自定义属性,而不是使用标准属性:

[MyCustomAuthorize]
public ActionResult MyAction()
{
    ...
}

答案 1 :(得分:0)

您可以在特定方法或控制器中使用AllowAnonymousAttribute来“覆盖”基本控制器中使用的AuthorizeAttribute。

检查参考:https://docs.microsoft.com/en-us/previous-versions/aspnet/hh835113(v%3dvs.118)

另一个选择是,您可以创建一个自定义属性,并在基本控制器中使用它。这样,您可以在自定义属性中添加做出决策所需的所有逻辑。

检查参考:https://docs.microsoft.com/en-us/dotnet/standard/attributes/writing-custom-attributes

洛杉矶,