【问题标题】:How to modify the "Global.asax" of a Web API just to impact the Help Page? (MVC)如何修改 Web API 的“Global.asax”以影响帮助页面? (MVC)
【发布时间】:2015-02-24 14:00:11
【问题描述】:

* 场景:*

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

* 问题:*

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

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

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

感谢和亲切的问候,

【问题讨论】:

    标签: c# .net asp.net-mvc-4 asp.net-web-api2 asp.net-web-api-helppages


    【解决方案1】:

    如果我理解您的问题,您只想通过授权路由到特定路径?

    如果是这种情况,您可以使用路由作为 WebAPI 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 上下文/请求的一部分传递给 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。

    【讨论】:

    • 我从未见过/这样想,这似乎比我的方法更容易。但我仍然需要自己制作角色映射,我不知道在哪里
    • @Leandro 我添加了一些可能有帮助的额外信息
    • 非常感谢!是的,我看到了如何实现类似的东西以及 FormsAuthTicket !
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多