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

Мы создали проект веб-API, в котором мы использовали обычную аутентификацию. Мы использовали пакет nuget для создания справочной документации по Web Api, поэтому он добавил новую область, контроллер и представления для справки Web Api. Мы разместили веб-API на IIS. Прямо сейчас любой может просмотреть справку по Web Api, просто просмотрев URL-адрес Web Api " http://localhost/WebApi/Help". Мы хотим аутентифицировать справочные страницы (которые реализованы в MVC). Вопрос в том, что мой веб-интерфейс API использует базовую аутентификацию, и я хочу создать механизм, позволяющий аутентифицировать веб-API-интерфейс перед любым запросом на страницу справки Web-API.

Для этого я создал страницу "AccountController", "Login". Я также создал фильтр аутентификации и украсил "HelpController" (в котором есть все действия для рендеринга страниц справки). Код страницы входа:

public ActionResult Login(LoginViewModel model)
{
    bool isValidated = //Code for validating the users
    if (ModelState.IsValid && isValidated)
    {
      var identity = new HelpAuthenticationIdentity(model.UserName, model.Password);
      var principal = new WindowsPrincipal(identity);
      ControllerContext.HttpContext.User = principal;

      return RedirectToAction("Index", "Help", new { area = "HelpPage" });
    }
    else
      return View();
}

Я создал класс для идентичности, который наследует класс WindowsIdentity

public class HelpAuthenticationIdentity : WindowsIdentity
{
  public HelpAuthenticationIdentity(string userName, string password)
        : base(userName, "Basic")
  {
     this.Password = password;         
  }
  public string Password { get; set; }
}

Когда я нажимаю на логин после ввода действительных учетных данных, он перенаправляется на действие " Индекс" контроллера справки. Поскольку у меня есть фильтр аутентификации, он сначала вызовет метод OnAuthentication. Здесь он всегда получает флаг "context.HttpContext.User.Identity.IsAuthenticated" как ложный. Атрибут фильтра аутентификации выглядит следующим образом:

/// <summary>
/// Authentication filter to authenticate the request for Web Api Help
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]
public class HelpAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter
{
    public void OnAuthentication(AuthenticationContext context)
    {
        if (!context.HttpContext.User.Identity.IsAuthenticated)
        {
            context.Result = new HttpUnauthorizedResult();
        }
    }

    public void OnAuthenticationChallenge(AuthenticationChallengeContext context)
    {
        if(context.Result == null || context.Result is HttpUnauthorizedResult)
        {
            context.Result = new RedirectToRouteResult("Login",
                new System.Web.Routing.RouteValueDictionary{
                    {"controller", "Account"},
                    {"action", "Login"}
                });
        }
    }
}

Пожалуйста, укажите ваши данные.

1 ответ

Решение

Проблема решена. Я изменил свое действие при входе в систему:

[HttpPost]
public ActionResult Login(LoginViewModel model)
{
    bool isValidated = //Code for validating the users
    if (ModelState.IsValid && isValidated)
    {
        //Set the authentication cookie for the logged in user.
        FormsAuthentication.SetAuthCookie(model.UserName, true);
        return RedirectToAction("Index", "Help", new { area = "HelpPage" });
    }
    else
    {
        return View();
    }                
}

Я реализовал метод Application_AuthenticateRequest в Global.asax.cs

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    try
    {
        if (Context.Request.Cookies[".ASPXAUTH"] != null)
        {
            var authCookie = FormsAuthentication.Decrypt(Context.Request.Cookies[".ASPXAUTH"].Value);
            var identity = new GenericIdentity(authCookie.Name);
            Context.User = new GenericPrincipal(identity, null);
        }
        else
        {
            Context.User = null;
        }
    }
    catch(Exception ex)
    {
        Context.User = null;
    }
}

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

Другие вопросы по тегам