Soru Owin için System.Web'de HttpContext'i kullanmanın alternatifi


ASP.NET kimlik doğrulaması artık herhangi bir OWIN tabanlı ana bilgisayarda kullanılabilen OWIN ara katmanına dayanmaktadır. ASP.NET Kimliği System.Web üzerinde herhangi bir bağımlılığı yok.

Geçerli kullanıcıyı almam ve daha sonra eylem denetleyicileri tarafından alınacak bazı özellikler eklemem gereken bir AuthorizeAttribute filtresim var.

Sorun şu ki, System.Web'e ait HttpContext wich'i kullanmam gerekiyor. Owin için HttpContext'in bir alternatifi var mı?

public class WebApiAuthorizeAttribute : AuthorizeAttribute 
{
    public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
    {
        base.OnAuthorization(actionContext);

        Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());

        ApplicationUserManager manager = new ApplicationUserManager(new ApplicationUserStore(new ApplicationDbContext())) { PasswordHasher = new CustomPasswordHasher() };
        ApplicationUser user = await manager.FindByIdAsync(userId);

        actionContext.Request.Properties.Add("userId", user.LegacyUserId);
    }
}

Not: buldum bu sorubir kopyası gibi görünüyor, ama NancyFx projesi için çalışan bir çözüm istiyor, bu benim için geçerli değil.


21
2017-07-04 10:58


Menşei




Cevaplar:


Kullanabilirsiniz OwinRequestScopeContext. Tam olarak ne aradığınızı yapıyor.


10
2017-07-04 11:02



İyi çözüm için +1. Anladığım şu ki, OWIN ile artık Otomatik Hizalama filtreleri için yer yok. - Xavier Egea
@Freerider okuduktan sonra bu Yetkilendirme Filtresi hala gitmek için yol gibi görünüyor. - Morio
@Morio Sana katılıyorum. Mesaj için teşekkürler. - Xavier Egea
OwinRequestScopeContext.Current her zaman boş. Lütfen yardım et. - Kumar
Ayrıca benim için null, çok emin ben de başlangıçta doğru şekilde kablolu, oh iyi bir atış değerdi. - RandomUs1r


Bu makale bana çözümü veriyor:

Web API 2 yeni bir tanıttı   Bir Principal özellik içeren RequestContext sınıfı. Bu şimdi   Arayanın kimliğini aramak için uygun yer. Bu   Thread.CurrentPrincipal ve / veya önceki mekanizmalarının yerini alır.   HttpContext.User. Bu, eğer varsa, atadığınız şeydir   Web API'sında arayanın kimliğini doğrulamak için kod yazmak.

Yani sadece satırı değiştirmek:

Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());

tarafından

Guid userId = new Guid(actionContext.RequestContext.Principal.Identity.GetUserId());

şimdi, System.Web başvurusu artık gerekli değildir.


8
2017-07-07 12:39





Okuduktan sonra bu. Bana öyle geliyor ki, AuthorizeAttribute’i genişletmenin hala devam etmenin yolu. Ancak, HttpContext IIS tabanlı olduğundan, bundan böyle kullanmaktan kaçınmak istiyoruz.

Bir HttpActionContext geçmiştir. Sonra kullanabilirdik

actionContext.Request.GetRequestContext().Principal.Identity

veya

actionContext.RequestContext.Principal.Identity

VEYA

actionContext.Request.GetOwinContext().Request.User.Identity kimliğe ulaşmak için. Her üçü de aynı kimlik nesnesini alacaktır.

ve evet, OwinContext bu şekilde de kullanılabilir.


3
2017-11-25 18:17