: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;
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
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.
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ğarEğ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
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 ...
Bu yardımcı olur. RC2 için herhangi bir ETA? –
Hiçbirini paylaşabilirim. – blowdart
Lütfen "Örnek projeleri güncelle" sorununu kapatın ve bırakın ... :-) –