2016-04-14 11 views
0

:Kaynak Yetkilendirme Aşağıdaki denetleyiciniz bir ASP.NET Çekirdeğinin DTOs ve Otobüs senaryosu

public class MessageApiController : Controller { 

    private readonly IMediator _mediator; 

    public MessageApiController(IMediator mediator) { 
    _mediator = mediator; 
    } 

    [HttpGet("messages")] 
    public async Task<IActionResult> Get(MessageGetQuery query) { 
    MessageGetReply reply = await _mediator.SendAsync(query);   
    return Ok(reply); 
    } 

    [HttpDelete("messages")] 
    public async Task<IActionResult> Delete(MessageDeleteModel model) { 
    MessageDeleteReply reply = await _mediator.SendAsync(model);   
    return Ok(reply); 
    } 

} 

Bir yöntem saplı işleyicileri sınıfları bu eylemleri gerçekleştirmek için:

GET (basitlik açısından)

public async MessageGetReply Handle(MessageGetQuery query) { 

    IQueryable<Message> messages = _context.Messages.AsQueryable(); 

    messages = messages.Include(x => x.Author).Include(x => x.Recipients); 

    // Omitted: Filter messages according to query 

    List<Message> result = await messages.ToListAsync(); 

    // Omitted: Create MessageGetReply from result 

} // Handle 

için kısa kod s uğruna (kısa bir kod DELETE implicity)

public async MessageDeleteReply Handle(MessageDeleteModel model) { 

    Message message = await _context.Messages.FirstOrDefaultAsync(x => x.Id == model.Id); 

    if (message != null) { 
    _context.Remove(message); 
    await _context.SaveChangesAsync(); 
    } 

    // Omitted: Return reply 

} // Handle 

yetkilendirme senaryo aşağıdaki gibidir:

GET kullanıcı
2. User.Id Message.RecipientId eşit olmalıdır kimliğinin doğrulanması gerekir
1.;

DELETE
1. Kullanıcı
2. User.Id Message.AuthorId eşit olmalıdır kimliğinin doğrulanması gerekir;

Yani şu kaynak yetkilendirme işleyicisi oluşturuldu:

public class MessageAuthorizationHandler : AuthorizationHandler<OperationAuthorizationRequirement, Message> { 

    protected override void Handle(AuthorizationContext context, OperationAuthorizationRequirement requirement, Message resource) { 

    if (requirement == Operations.Delete) {   
     if (resource.AuthorId.ToString() == context.User.FindFirstValue(ClaimTypes.NameIdentifier)) 
     context.Succeed(requirement); 
    } 

    if (requirement == Operations.Read) { 
     if (resource.RecipientId.ToString() == context.User.FindFirstValue(ClaimTypes.NameIdentifier))) 
     context.Succeed(requirement); 
    } 

    } // Handle 

} 

ortaya birkaç sorun vardır: GET olarak

  1. Ben Yetkilendirme Handler'a tüm iletileri geçmelidir? Kaynak İleti Listesi olduğundan yetkilendirme işleyicisi MessageGetQuery.AuthorId ve bir listesi ... almak Ama garip hissediyor olabilir Yani

    Aslında mesajlar MessageGetQuery.AuthorId ... tarafından filtre edilir. MessageGetQuery sadece bir DTO'dur.

  2. Yetkilendirme, DTO'lara (Sorgu ve Model) bağlanabilir, ancak anlamlı mıdır? DTO Varlık daha az bilgi vardır ve ben yetkilendirilmesine ilişkin karar alma bu bilgileri gerektiğinde
    sorun ... doğar

  3. Eğer varlıkları kullanarak kaynakları olarak ben projeksiyon yapmak için yeteneği gevşek:

    IQueryable<Message> messages = _context.Messages.AsQueryable(); 
    
    messages = messages.Include(x => x.Author).Include(x => x.Recipients); 
    
    // Omitted: Filter messages according to query 
    
    List<Message> result = await messages.ToListAsync(); 
    
    // CALL authorization and send the resource messages ... 
    
    // Omitted: Create MessageGetReply from result 
    
  4. bir çözüm, Okuma Mesajları Sil mesajın için bir AuthorizationHandler bir AuthorizationHandler sahip olacaktır ... iletilerin listesini alacağını ilki, ikincisi mesajı ... Ben ancak istiyorsunuzbirçok sınıfa sahip olmak. kontrolörler ve hiçbir DTOs doğrudan Varlıkları kullanarak ama bu, IMHO, yapılmamalıdır zaman

Her şey daha basit hale gelir ...

cevap

1

RC2'de, auth işleyicilerindeki nesne kısıtlamasını kaldırdık, böylece ints'i kullanabilirsiniz. Böylece repo'unuzu bir işleyiciye enjekte edebilir ve DTO'larınızı dilediğiniz gibi çekebilirsiniz.

+0

Bu yardımcı olur. RC2 için herhangi bir ETA? –

+0

Hiçbirini paylaşabilirim. – blowdart

+0

Lütfen "Örnek projeleri güncelle" sorununu kapatın ve bırakın ... :-) –

İlgili konular