Всем привет. Продолжаю делать web api. Прикрутил базовую аутентификацию, как описано
здесь (через филтпы).
Использую так:
[IdentityBasicAuthentication]
[Authorize(Roles = "Admin, Client")]
public class MyController : MyApiControllerBase
{
public async Task<IHttpActionResult> SomeMethod()
{
var someManager = new SDK.SomeManager(UserName, Password);
var result = List<Model>();
if (User.IsInRole("Client"))
{
result = await someManager.ClientMethod();
}
if (User.IsInRole("Admin"))
{
result = await someManager.AdminMethod();
}
return Ok(result);
}
}
И сам базовый ApiControllerBase:
public class ApiControllerBase : ApiController
{
protected internal string UserName { get; private set; }
protected internal string Password { get; private set; }
public ApiControllerBase()
{
SetUserNameAndPassword();
}
#region Authorization
[NonAction]
private void SetUserNameAndPassword()
{
var authHeader = HttpContext.Current.Request.Headers["Authorization"];
var identity = (ClaimsIdentity)User.Identity;
IEnumerable<Claim> claims = identity.Claims;
if (string.IsNullOrEmpty(authHeader) || !authHeader.StartsWith("Basic"))
{
Unauthorized();
return;
}
var encodedUsernamePassword = authHeader.Substring("Basic ".Length).Trim();
var userNameAndPasword = BasicAuthenticationAttribute.ExtractUserNameAndPassword(encodedUsernamePassword);
if (userNameAndPasword == null)
{
Unauthorized();
return;
}
UserName = userNameAndPasword.Item1;
Password = userNameAndPasword.Item2;
Ok();
}
#endregion
}
Т.е. у меня всегда есть логин и пароль из заголовка.
Смущают две вещи:
- Метод из конструктора MyApiControllerBase вызывается раньге, чем фильтр авторизации. Хотелось бы сохранять логин-пароль в филтьтре, но где?
- Чем заменить if UserInRole? Стратегией?
Благодарю за помощь!