Geçerli ApplicationUser için veritabanını doğrudan sorgulamanız gerekmez.
Bu, yeni başlayanlar için ekstra bir bağlama sahip olmak için yeni bir bağımlılık getiriyor, ancak ileride kullanıcı veritabanı tabloları değişiyor (son 2 yılda 3 kez), ancak API tutarlı. Örneğin, users
tablo şimdi AspNetUsers
Identity Framework içinde çağrıldı ve birkaç birincil anahtar alanının adları değişmeye devam etti, bu nedenle birkaç cevaptaki kod artık olduğu gibi çalışmayacak .
Başka bir sorun, veritabanının altında yatan OWIN erişiminin ayrı bir bağlam kullanmasıdır, bu nedenle ayrı SQL erişimindeki değişiklikler geçersiz sonuçlar üretebilir (örneğin veritabanında yapılan değişiklikleri görmemek). Yine çözüm, verilen API ile çalışmak ve çözüm bulmaya çalışmak değil.
ASP.Net kimliğindeki geçerli kullanıcı nesnesine (bu tarihte olduğu gibi) erişmenin doğru yolu:
var user = UserManager.FindById(User.Identity.GetUserId());
veya zaman uyumsuz bir işleminiz varsa şuna benzer:
var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
FindById
async olmayan UserManager
yöntemlerin kullanılabilmesi için aşağıdaki kullanım ifadesine sahip olmanızı gerektirir (bunlar UserManager için uzantı yöntemleridir , bu yüzden bunu eklemezseniz yalnızca göreceksiniz FindByIdAsync
):
using Microsoft.AspNet.Identity;
Hiç bir denetleyicide değilseniz (örn. IOC enjeksiyonu kullanıyorsanız), kullanıcı kimliği aşağıdakilerden tam olarak alınır:
System.Web.HttpContext.Current.User.Identity.GetUserId();
Standart Hesap denetleyicisinde değilseniz, denetleyicinize aşağıdakileri (örnek olarak) eklemeniz gerekir:
1. Bu iki özelliği ekleyin:
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext ApplicationDbContext { get; set; }
/// <summary>
/// User manager - attached to application DB context
/// </summary>
protected UserManager<ApplicationUser> UserManager { get; set; }
2. Bunu Denetleyicinin yapıcısına ekleyin:
this.ApplicationDbContext = new ApplicationDbContext();
this.UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(this.ApplicationDbContext));
Mart 2015 Güncellemesi
Not: Kimlik çerçevesine yapılan en son güncelleme, kimlik doğrulama için kullanılan temel sınıflardan birini değiştirir. Artık ona mevcut HttpContent'in Owin Bağlamından erişebilirsiniz.
ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());
Zeyilname:
EF ve Identity Framework'ü Azure ile kullanırken, uzak bir veritabanı bağlantısı üzerinden (örneğin, Azure veritabanına yerel ana bilgisayar testi), korkunç "hata: 19 - Fiziksel bağlantı kullanılamaz" seçeneğini rastgele vurabilirsiniz. Neden yeniden deneme ekleyemediğiniz (veya eksik görünen .Include(x->someTable)
) Identity Framework içine gömüldüğünden SqlAzureExecutionStrategy
, projenize bir özel uygulama uygulamanız gerekir .