我们已经创建了一个web api项目,我们暂时使用了基本身份验证。我们使用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","登录"页。我还创建了一个身份验证过滤器并装饰了" 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"}
});
}
}
}
请提供您的意见。
答案 0 :(得分:0)
问题已解决。我修改了我的登录操作:
[1, 2, 3, 4]
[[-4, -9], [-3, -6, -7]]
我在Global.asax.cs中实现了“Application_AuthenticateRequest”方法
[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();
}
}
输入有效凭据后,将对用户进行身份验证,然后将其重定向到帮助页面。