将Web Api文档放在登录页面后面,以便只有有效用户才能浏览Web Api帮助文档

时间:2016-04-26 09:14:38

标签: authentication asp.net-web-api asp.net-web-api-helppages asp.net-mvc-5

我们已经创建了一个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"}
                });
        }
    }
}

请提供您的意见。

1 个答案:

答案 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();
    }                
}

输入有效凭据后,将对用户进行身份验证,然后将其重定向到帮助页面。