如何修改 Web API 的 "Global.asax" 以影响帮助页面? (MVC)

How to modify the "Global.asax" of a Web API just to impact the Help Page? (MVC)

* 场景:*

我有一个用 C# Visual Studio 2012 制作的 Web api 服务应用程序。 此 Web 服务有一个 "Areas" 文件夹,其中包含 Web Api 帮助页面的默认项目。

* 问题:*

根据要求,我必须实施手动输入来验证和授权可以阅读 Web Api 帮助页面的用户。但不在网络服务中。

到目前为止一切顺利,我已经制作了一个帐户控制器、登录程序、从数据库中获取角色等。
但是现在,我试图实现的是如何在global.asax中编写Application_PostAuthenticateRequest过程,因为唯一global.asax我的是主项目,Web API帮助页面没有他自己的。

* 问题 *
如何在不影响主服务的情况下编写 Application_PostAuthenticateRequest 方法,以便使用授权属性 Web API 帮助页面中仅

谢谢和亲切的问候,

如果我理解你的问题,你想路由到仅具有授权的特定路径?

如果是这种情况,您可以将路由用作 Web 的一部分API 2

WebAPIConfig.cs内添加如下配置

public static void Register(HttpConfiguration config)
{
 //Enable attribute routing
 config.MapHttpAttributeRoutes();

//... additional configuraitons
}

然后在您的 API 控制器中,您可以设置独立于默认值的路由并添加您需要的任何属性:

[Route("apiname/authroizedLogin")]
[Authorize(Roles="admin")]
public void IHttpActionResult(string username, stringpassword)
{
   try
   {
    dosomething...
    return Ok(somecontext);
   }
   catch(exception e)
   {
    return BadResponse(e.message);
   }
}

Here is a link with more information on routes in WebAPI 2

编辑

关于访问角色。这取决于您的实施。我个人不喜欢使用 global.asx,因为它会更频繁地发出数据库请求。我需要有关您的实施的更多信息才能提出任何真正的建议。但是这里有几个选项。如果您使用 claims based authentication,角色可以是声明的一部分,并将作为 http context/request 的一部分传递给 API。从这里您可以得出以下身份:

   public long RoleId
    {
        get
        {
            var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
            string id = identity.Claims.Where(c => c.Type == "http://myschema.com/app/claims/roleid")
                .Select(c => c.Value).SingleOrDefault();

            //return 0 if no claim is located
            return (!String.IsNullOrEmpty(id)) ? Convert.ToInt32(id) : 0;
        }
        set
        {
            _userId = value;
        }
    }

如果您不使用声明,另一种选择是生成一个 FormsAuthenticaitonTicket,一旦用户通过身份验证,它就可以被加密并存储为 cookie。