WEB API-авторизация на уровне контроллера или действия (без аутентификации)

У меня есть API, который не имеет подлинности. Это общедоступный веб-API, который используют несколько клиентов, делая простые запросы.

теперь необходимо авторизовать доступ к определенному методу.

есть ли способ сделать это, сохраняя остальные контроллеры и соответствующие методы "открытыми" для клиентов, которые уже используют этот веб-API?

Как я могу определить, имеет ли запрос разрешения на доступ к этому "защищенному" методу?

3 ответов


что вам нужно сделать, это добавить [Authorize] атрибут методов, которые вы хотите защитить дополнительно с помощью перегрузки, которая принимает одно или несколько имен ролей, вызывающий пользователь должен быть.

тогда вам придется реализовать способ гарантировать, что данные аутентификации вызывающего абонента преобразуются в основной объект. Установка принципала-это, как правило, то, что вы не делаете сами, но вместо этого у вас есть рамки для вас.

если вы хотите предоставьте свой собственный интерфейс, вы можете использовать фильтр аутентификации, реализующий System.Web.Http.Filters.IAuthenticationFilter интерфейс.

так что вы получите это:

[MyAuthentication]
[Authorize]
public SomeClass MyProtectedMethod() {
    return new SomeClass();
}

а затем реализовать . Ниже приведен пример, важно то, что вы используете контекст входящего запроса и в конечном итоге устанавливаете context.Principal свойство с новым Принципалом

public class MyAuthentication : ActionFilterAttribute, System.Web.Http.Filters.IAuthenticationFilter {

    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
    {
        // 1. Look for credentials in the request.
        HttpRequestMessage request = context.Request;
        AuthenticationHeaderValue authorization = request.Headers.Authorization;

        // 2. If there are no credentials, do nothing.
        if (authorization == null)
        {
            return;
        }

        // 3. If there are credentials but the filter does not recognize the 
        //    authentication scheme, do nothing.
        if (authorization.Scheme != "Basic")
        {
            return;
        }

        // 4. If there are credentials that the filter understands, try to validate them.
        // 5. If the credentials are bad, set the error result.
        if (String.IsNullOrEmpty(authorization.Parameter))
        {
            context.ErrorResult = new AuthenticationFailureResult("Missing credentials", request);
            return;
        }

        Tuple<string, string> userNameAndPasword = ExtractUserNameAndPassword(authorization.Parameter);
        if (userNameAndPasword == null)
        {
            context.ErrorResult = new AuthenticationFailureResult("Invalid credentials", request);
        }

        string userName = userNameAndPasword.Item1;
        string password = userNameAndPasword.Item2;

        IPrincipal principal = await AuthenticateAsync(userName, password, cancellationToken);
        if (principal == null)
        {
            context.ErrorResult = new AuthenticationFailureResult("Invalid username or password", request);
        }

        // 6. If the credentials are valid, set principal.
        else
        {
            context.Principal = principal;
        }

    }


    ... other interface methods here
}

Я надеюсь, это поможет вам встать на правильный путь. Для получения дополнительной информации проверьте это должность: http://www.asp.net/web-api/overview/security/authentication-filters


можно использовать [Authorize] атрибут в конкретном методе API, а также на уровне контроллера. В случае, если вы положили на уровне контроллера, то вы можете использовать [AllowAnonymous] атрибут для тех методов API, к которым вы хотите получить доступ без аутентификации.


по умолчанию авторизация глобально отключена в приложении. Вы можете заставить контроллер разрешать только авторизованные запросы, добавив фильтр действий [авторизовать].

[Authorize]  // This will enforce all methods inside should be authorized
public class AuthorizeController : ApiController
{
      //this method will only be called if user is authorized
      public IHttpActionResult GetList()
      {
         return Ok();
      }
}

вы также можете принудительно разрешить только определенные методы:

public class AuthorizeController : ApiController
{
      [Authorize] //this method will only be called if user is authorized
      public IHttpActionResult GetList()
      {
         return Ok();
      }

      // This method can still be called even if user is not authorized
      public IHttpActionResult GetListUnauthorized()
      {
         return Ok();
      }
}

или просто отключить авторизацию на некоторых методах внутри контроллера, который требует авторизации:

[Authorize]
public class AuthorizeController : ApiController
{
      //this method will only be called if user is authorized
      public IHttpActionResult GetList()
      {
         return Ok();
      }

      [AllowAnonymous]// This method can be called even if user is not authorized due the AllowAnonymous attribute
      public IHttpActionResult GetListUnauthorized()
      {
         return Ok();
      }
}

вы также можете установить, кому разрешен доступ к вашему методу использование:

[Authorize(Users="Joey,Billy")]

или по правилам, используя:

[Authorize(Roles="Administrator,Manager")]

или даже построить более сложный атрибут авторизации, как в этом ответе (на основе утверждений):атрибут авторизации по претензиям