我有一个提供事件的控制器。 Controller提供将返回一系列事件的路由GET => /Events
。
此Controller可以为3种不同类型的身份验证提供事件。 Admin
,Api
和User
。
如果请求者被认证为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() { }
}
答案 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) {
//...
}
}