如何在Web API应用程序中使除除帐户控制器之外的每个控制器都要求用户进行身份验证

时间:2014-05-12 09:29:11

标签: asp.net asp.net-mvc asp.net-web-api asp.net-web-api2

我意识到我可以用[授权]装饰每个控制器。

但是有没有办法让我可以全局执行此操作以使其成为默认值,然后将Account控制器设置为匿名?

4 个答案:

答案 0 :(得分:4)

创建一个所有其他控制器继承的BaseController。然后让这个类继承自Controller,就像这样

SomeController : BaseController

然后在BaseController中

BaseController : Controller

将authorize属性添加到基本控制器。从BaseController继承的所有控制器现在都需要授权。控制器,不,不。因此,您的帐户控制器将仅从Controller继承,而不是BaseController,因为您不希望此授权。

拥有基本控制器还有其他优点。例如,您可以覆盖执行的OnAction以记录应用程序使用情况。

我会创建一个名为BaseUnsecuredController的第二个基本控制器,您的帐户控制器可以从该控制器继承该控制器没有授权的attrubute。然后有一个抽象的基本控制器类,它包含你希望在基本控制器之间共享的常见操作的实现,比如日志记录和错误处理。

希望这有帮助。

答案 1 :(得分:2)

使用每个控制器继承的basecontroller。然后在基本控制器上设置[Authorize]属性。

答案 2 :(得分:1)

像这样全局应用过滤器。

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Existing code
        config.Filters.Add(new System.Web.Http.AuthorizeAttribute());
    }
}

然后,在AccountController或特定操作方法上应用[AllowAnonymous]

[AllowAnonymous]
public class AccountController : WebApiController {}

答案 3 :(得分:0)

您可以通过更改FilterConfig全局添加AuthorizeAttribute,将其添加到所有请求中:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    //Other filters
    filters.Add(new AuthorizeAttribute());
}

之后,您可以将[OverrideAuthorization]属性添加到控制器。

如果您在全球范围内设置了任何AuthenticationFilter,则无法重置。如果要重置两者,还需要使用[OverrideAuthentication]属性。