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")]
или даже построить более сложный атрибут авторизации, как в этом ответе (на основе утверждений):атрибут авторизации по претензиям