Задать вопрос
@zop

Web Api Basic Auth: Как сохранить логин и пароль?

Всем привет. Продолжаю делать 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
}


Т.е. у меня всегда есть логин и пароль из заголовка.

Смущают две вещи:
  1. Метод из конструктора MyApiControllerBase вызывается раньге, чем фильтр авторизации. Хотелось бы сохранять логин-пароль в филтьтре, но где?
  2. Чем заменить if UserInRole? Стратегией?


Благодарю за помощь!
  • Вопрос задан
  • 787 просмотров
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
Rou1997
@Rou1997
Никак, они должны сохраняться в браузере, а не на сервере.
Ответ написан
yarosroman
@yarosroman Куратор тега C#
C# the best
Рекомендую прикрутить token авторизацию, в шаблоне стандартном есть пример, в токене можно и роли и все сохранить.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы