Geçerli kullanıcı nasıl alınır ve MVC5 kullanıcı sınıfı nasıl kullanılır?


159
  • MVC 5'te oturum açmış olan kullanıcının kimliğini nasıl edinebilirim ? StackOverflow önerilerini denedim, ancak MVC 5 için değil gibi görünüyor.
  • Ayrıca, MVC 5 kullanıcılara bir şeyler atamak için en iyi uygulama nedir? (örneğin, Userolmalıdır Items. Kullanıcının Idiçinde saklamalı mıyım Item? UserSınıfı bir List<Item>navigation özelliği ile genişletebilir miyim ?

MVC şablonundan "Bireysel Kullanıcı Hesapları" kullanıyorum.

Bunları denedim:

'Membership.GetUser ()' boş.


Denediklerimin referansları eklendi. Sonuncusu MVC4'te iyiydi ama MVC5'te değildi. Ayrıca "Kullanıcı kullanma" :) bazı en iyi uygulama gerekir
Adam Szabo

MVC 5 kullandığınızı söylediğinizde, üyelik için ne kullanıyorsunuz? OWin.Security?
Aron

MVC şablonundan "Bireysel Kullanıcı Hesapları".
Adam Szabo

3
HttpContext.Current.User.Identity.Nameşu anda oturum açmış olan kullanıcının adıdır.
Wiktor Zychla

1
Kimlik nasıl alınır ? Geçerli kullanıcıyı Itemoluşturduğu kişiye atamak istiyorum , ancak kullanıcı adına (bu değişebilir) dayanmıyor. `` HttpContext.Current 'System.Web.HttpContextBase' 'Current' için bir tanım içermiyor ve 'System.Web.HttpContextBase' türünün ilk bağımsız değişkenini kabul eden 'Current' uzantı yöntemi bulunmuyorken çalışmıyor. kullanma talimatını veya montaj referansını kaçırıyor musunuz?) `. Çözümünüzün MVC 5 için olduğundan emin misiniz?
Adam Szabo

Yanıtlar:


313

Bir ASP.NET MVC Denetleyicisinde kodlama yapıyorsanız,

using Microsoft.AspNet.Identity;

...

User.Identity.GetUserId();

Bahsetmeye değer User.Identity.IsAuthenticatedve User.Identity.Nameyukarıda belirtilen usingifadeyi eklemeden çalışacaktır . Ama GetUserId()onsuz mevcut olmayacak.

Denetleyici dışında bir sınıfdaysanız şunu kullanın:

HttpContext.Current.User.Identity.GetUserId();

MVC 5'in varsayılan şablonunda, kullanıcı kimliği dize olarak saklanan bir GUID'dir.

Henüz en iyi uygulama yok, ancak kullanıcı profilini genişletme hakkında bazı değerli bilgiler buldu:


9
ASP.NET MVC 5 için kullanıcı kimlik doğrulaması ve yetkilendirme değişti. Şimdi, EF veya diğer sağlayıcılarla kullanabileceğiniz arabirimler ve genel depolarla Talep tabanlı kimlik doğrulaması (EF uygulaması varsayılan olarak gelir). Yana GetUserIddibinde saklanan bir uzantısı yöntemidir Ass_Start\IdentityConfig.csbir ayrılmakta ad üzerinde, ayarlamak gerekecek eğer, onu kullanın gereken yere, using Microsoft.AspNet.Identitygörünür hale uzatılması için.
Anderson Matos

1
survey.UserId = Guid.Parse (User.Identity.GetUserId ());
NicoJuicy

Ben referans kullanarak eklemek Kullanıcı hala altı çizili kırmızı? Neden böyle olsun ki?
Zapnologica

@Zapnologica: projeyi yeniden oluşturmaya çalışın, belki VS IntelliSense biraz yavaştır.
Adam Szabo

5
NOT Kullanıcı yalnızca Denetleyici'de kullanılabilir msdn.microsoft.com/en-us/library/… (@Zapnologica bir denetleyicinin dışında mı kullanıyorsunuz? HttpContext.Current.User.Identity.GetUserId ();)
Adween

28

Şuna benzer bir şey deneyin:

var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var userManager = new UserManager<ApplicationUser>(store);
ApplicationUser user = userManager.FindByNameAsync(User.Identity.Name).Result;

RTM ile çalışır.


11
Gereksiz veritabanı gezisi uygular.
Arash

3
@Arash, uygulamanın veritabanına başvurmadan kullanıcının nesnesini alması nasıl gerekiyor?
fabspro

2
@Arash boşver, ne demek istediğini anlıyorum. Kimlik User.Identity.GetUserId () ile alınabilir; herhangi bir veritabanı gezisi olmadan.
fabspro

Mvc5 (üyelik 2) ile hatırlayın: User.Identity.GetUserId (), [AspNetUsers] tablosundaki id ile farklıdır. Jakub Arnold ve Rok doğru bir şekilde
Grey Wolf

Cevabı biraz kafam karıştı. Bir UserStore türü alıyorum denetleyicisi bağlamda görünmüyor. Herhangi bir fikir?
Jhourlad Estrella

19

ApplicationUser nesnesini bir kod satırında istiyorsanız (en son ASP.NET kimliğini yüklediyseniz), şunu deneyin:

ApplicationUser user = System.Web.HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindById(System.Web.HttpContext.Current.User.Identity.GetUserId());

Aşağıdaki ifadeleri kullanarak ihtiyacınız olacak:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

<ApplicationUserManager>
Fandango68

7

Kimliği almak oldukça basittir ve bunu çözdünüz.

İkinci sorunuz biraz daha ilgili.

Yani, şu anda tüm yayın öncesi şeyler, ancak karşılaştığınız ortak sorun, kullanıcıyı yeni özelliklerle (veya sorunuzdaki bir Eşya koleksiyonuyla) genişlettiğiniz yerdir.

Kutunun dışında IdentityModel, Modeller klasörü altında (yazma sırasında) adlı bir dosya alırsınız . Orada birkaç dersiniz var; ApplicationUserve ApplicationDbContext. Koleksiyonunuzu eklemek için , tıpkı Entity Framework ile kullandığınız normal bir sınıf olsaydı Items, ApplicationUsersınıfı değiştirmek isteyeceksiniz . Aslında, kaputun altına hızlı bir şekilde bakarsanız, tüm kimlikle ilgili sınıfların (Kullanıcı, Rol vb ...) sadece uygun veri ek açıklamalarına sahip POCO'lar olduğunu ve böylece EF6 ile iyi oynadıklarını göreceksiniz.

Ardından, AccountControllerDbContext'inizi kullanmayı bilmesi için yapıcıda bazı değişiklikler yapmanız gerekir .

public AccountController()
{
    IdentityManager = new AuthenticationIdentityManager(
    new IdentityStore(new ApplicationDbContext()));
}

Şimdi giriş yapmış kullanıcı için tüm kullanıcı nesnesi almak dürüst olmak için biraz ezoterik.

    var userWithItems = (ApplicationUser)await IdentityManager.Store.Users
    .FindAsync(User.Identity.GetUserId(), CancellationToken.None);

Bu satır işi halledecek ve istediğiniz userWithItems.Itemsgibi erişebileceksiniz .

HTH


Sanırım tüm bunlar için yayın öncesi dokümanlar gibi bir şey yok mu?
Derek Tomes

@Derek Tomes - Karşılaştığımdan değil. Sanırım gerçek dokümanlar için 13 Kasım'a kadar beklememiz gerekecek. Dürüst olmak gerekirse, uservoice'de
Unite

tamam ama bir tür örneğe nasıl ulaşabilirim AccountController?
yuva

0

Acını hissediyorum, aynı şeyi yapmaya çalışıyorum. Benim durumumda sadece kullanıcıyı temizlemek istiyorum.

Tüm denetleyicilerimin miras aldığı bir temel denetleyici sınıfı oluşturdum. İçinde geçersiz kılıyorum OnAuthenticationvefilterContext.HttpContext.User to null

Şimdiye kadar yönettiğim en iyisi bu ...

public abstract class ApplicationController : Controller   
{
    ...
    protected override void OnAuthentication(AuthenticationContext filterContext)
    {
        base.OnAuthentication(filterContext); 

        if ( ... )
        {
            // You may find that modifying the 
            // filterContext.HttpContext.User 
            // here works as desired. 
            // In my case I just set it to null
            filterContext.HttpContext.User = null;
        }
    }
    ...
}

0
        string userName="";
        string userId = "";
        int uid = 0;
        if (HttpContext.Current != null && HttpContext.Current.User != null
                  && HttpContext.Current.User.Identity.Name != null)
        {
            userName = HttpContext.Current.User.Identity.Name;              
        }
        using (DevEntities context = new DevEntities())
        {

              uid = context.Users.Where(x => x.UserName == userName).Select(x=>x.Id).FirstOrDefault();
            return uid;
        }

        return uid;

Lütfen herhangi bir yorum yapmadan sadece kodu göndermeyin. Kodunuzu açıklarsanız daha yararlı olur.
Ali Kanat

0

başka biri bu duruma sahipse: Kullanıcılarımın henüz oturum açmamış olması için uygulamamda oturum açmak için bir e-posta doğrulaması oluşturuyorum, ancak @firecape çözümünün bir varyasyonu olan girişe girilen bir e-postayı kontrol etmek için aşağıda kullandım

 ApplicationUser user = HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>().FindByEmail(Email.Text);

ayrıca aşağıdakilere de ihtiyacınız olacak:

using Microsoft.AspNet.Identity;

ve

using Microsoft.AspNet.Identity.Owin;

0

Net MVC5 core 2.2'de HttpContext.User.Identity.Name kullanıyorum. Benim için çalıştı.


0

Bu şekilde bir AspNetUser Kimliği aldım ve ana sayfamda görüntüledim

HomeController Index () yöntemime aşağıdaki kodu yerleştirdim

ViewBag.userId = User.Identity.GetUserId();

Görünüm sayfasında sadece

ViewBag.userId 

Projeyi çalıştırın ve kullanıcı kimliğinizi görebileceksiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.