Поместите документацию 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;
}
}
После ввода действительных учетных данных, пользователь проходит проверку подлинности и будет перенаправлен на страницу справки.