0

Мы создали проект веб-api, в котором мы использовали базовую аутентификацию на время. Мы использовали пакет nuget для создания справочной документации по Web Api, поэтому он добавил новую область, контроллер и представления для справки Web Api. Мы разместили веб-api на IIS. Прямо сейчас, любой может просматривать веб-помощь Api, просто просматривая веб-адрес Api «». Мы хотим аутентифицировать страницы справки (которые реализованы в MVC). Вопрос здесь в моем веб-api использует базовую аутентификацию, и я хочу создать механизм, чтобы справка web api была аутентифицирована перед любым запросом на страницу справки Web Api.Поместите документацию Web 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» как false. Атрибут фильтра аутентификации выглядит следующим образом:

/// <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"} 
       }); 
     } 
    } 
} 

Просьба представить ваши данные.

ответ

0

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

[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; 
    } 
} 

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