WebAPI多冲突路由 - 基于身份验证

时间:2017-09-02 15:12:40

标签: c# .net asp.net-web-api asp.net-web-api2 asp.net-web-api-routing

我有一个提供事件的控制器。 Controller提供将返回一系列事件的路由GET => /Events

此Controller可以为3种不同类型的身份验证提供事件。 AdminApiUser

如果请求者被认证为User我想返回Event对象但是作用域范围。 e.g。

class Event {
 public string Title { get; set; }
}

class EventView {
  public string Title { get; set; }
  public bool RSVPed { get; set; }
}

如何在我的控制器中实现这一点 -

[RoutePrefix("Events")]
class EventsController {

  [@Authorize(AuthenticationType.Admin, AuthenticationType.Api)]
  [HttpGet]
  [Route("")]
  public async Task<IHttpActionResult> Get() { }

  [@Authorize(AuthenticationType.User)]
  [HttpGet]
  [Route("")]
  public async Task<IHttpActionResult> Get() { }
}

1 个答案:

答案 0 :(得分:0)

使用所有允许的权限执行一项操作。在您根据授权委托人执行所需行为的行动中。

[RoutePrefix("Events")]
public class EventsController : ApiController {

    [Authorize(AuthenticationType.Admin, AuthenticationType.Api, AuthenticationType.User)]
    [HttpGet]
    [Route("")] //Matches GET => /Events
    public async Task<IHttpActionResult> Get() { 
        var user = User.Identity;
        if(user.AuthenticationType == AuthenticationType.User) {
            //...User specific code
        } else {
            //...Admin, API specific code
        }
    }

}

另外,你必须使路线独一无二,以免相互冲突。

[RoutePrefix("Events")]
public class EventsController : ApiController {

    [Authorize(AuthenticationType.Admin, AuthenticationType.Api)]
    [HttpGet]
    [Route("")] //Matches GET => /Events
    public async Task<IHttpActionResult> Get() { 
        //...
    }

    [Authorize(AuthenticationType.User)]
    [HttpGet]
    [Route("{id:int}")] //Matches GET => /Events/12345
    public async Task<IHttpActionResult> Get(int id) { 
        //...
    }
}