将 Web Api 文档放在登录页面后面,以便只有有效用户才能浏览 Web Api 帮助文档
Put the Web Api Documentation behind a login page so that only valid user can browse the Web Api help documentation
我们创建了一个 web api 项目,其中我们暂时使用了 Basic 身份验证。我们使用 nuget 包来生成 Web Api 帮助文档,因此它为 Web Api 帮助添加了新的区域、控制器和视图。
我们在 IIS 上托管了 Web api。现在,任何人都可以通过浏览 Web Api url“http://localhost/WebApi/Help”来浏览 Web Api 帮助。
我们想要验证帮助页面(在 MVC 中实现)。这里的问题是我的 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 class
的身份创建了一个 class
public class HelpAuthenticationIdentity : WindowsIdentity
{
public HelpAuthenticationIdentity(string userName, string password)
: base(userName, "Basic")
{
this.Password = password;
}
public string Password { get; set; }
}
当我在输入有效凭据后单击登录时,它将被重定向到 Index 控制器的 Help 操作。因为我有身份验证过滤器,所以它会首先调用 "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"}
});
}
}
}
请提供您的意见。
问题已解决。我已经修改了我的登录操作:
[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();
}
}
我在Global.asax.cs
中实现了"Application_AuthenticateRequest"方法
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;
}
}
输入有效凭据后,用户将通过身份验证并将被重定向到帮助页面。
我们创建了一个 web api 项目,其中我们暂时使用了 Basic 身份验证。我们使用 nuget 包来生成 Web Api 帮助文档,因此它为 Web Api 帮助添加了新的区域、控制器和视图。 我们在 IIS 上托管了 Web api。现在,任何人都可以通过浏览 Web Api url“http://localhost/WebApi/Help”来浏览 Web Api 帮助。 我们想要验证帮助页面(在 MVC 中实现)。这里的问题是我的 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 class
的身份创建了一个 classpublic class HelpAuthenticationIdentity : WindowsIdentity
{
public HelpAuthenticationIdentity(string userName, string password)
: base(userName, "Basic")
{
this.Password = password;
}
public string Password { get; set; }
}
当我在输入有效凭据后单击登录时,它将被重定向到 Index 控制器的 Help 操作。因为我有身份验证过滤器,所以它会首先调用 "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"}
});
}
}
}
请提供您的意见。
问题已解决。我已经修改了我的登录操作:
[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();
}
}
我在Global.asax.cs
中实现了"Application_AuthenticateRequest"方法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;
}
}
输入有效凭据后,用户将通过身份验证并将被重定向到帮助页面。