Saya menggunakan MVC5 Identity 2.0 agar pengguna dapat masuk ke situs web saya, tempat rincian otentikasi disimpan dalam database SQL. Asp.net Identity telah diimplementasikan dengan cara standar seperti yang dapat ditemukan di banyak tutorial online.
Kelas ApplicationUser di IdentityModels telah diperluas untuk menyertakan beberapa properti kustom, seperti integer OrganizationId. Idenya adalah bahwa banyak pengguna dapat dibuat dan ditugaskan ke Organisasi umum untuk tujuan hubungan basis data.
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
//Extended Properties
public DateTime? BirthDate { get; set; }
public long? OrganizationId { get; set; }
//Key Mappings
[ForeignKey("OrganizationId")]
public virtual Organization Organization { get; set; }
}
Bagaimana saya bisa mengambil properti OrganizationId dari pengguna yang saat ini masuk dari dalam pengontrol? Apakah ini tersedia melalui metode setelah pengguna login atau apakah saya selalu memiliki mengambil OrganizationId dari database, berdasarkan UserId, setiap kali metode controller dijalankan?
Membaca di web saya telah melihat saya perlu menggunakan yang berikut untuk mendapatkan UserId login dll
using Microsoft.AspNet.Identity;
...
User.Identity.GetUserId();
Namun, OrganizationId bukan properti yang tersedia di User.Identity. Apakah saya perlu memperluas User.Identity untuk memasukkan properti OrganizationId? Jika demikian, bagaimana caranya?
Alasan saya sangat membutuhkan OrganizationId adalah karena banyak permintaan tabel bergantung pada OrganizationId untuk mengambil data yang relevan dengan Organisasi yang terkait dengan pengguna yang masuk.
Jawaban:
Kapan pun Anda ingin memperluas properti User.Identity dengan properti tambahan seperti pertanyaan di atas, tambahkan properti ini ke kelas ApplicationUser seperti:
Maka yang Anda butuhkan adalah membuat metode ekstensi seperti itu (saya membuat milik saya di folder Ekstensi baru):
Ketika Anda membuat Identity di kelas ApplicationUser, cukup tambahkan Klaim -> OrganizationId seperti:
Setelah Anda menambahkan klaim dan menerapkan metode ekstensi, untuk menjadikannya tersedia sebagai properti di Pengguna Anda. Identitas, tambahkan pernyataan penggunaan pada halaman / file yang ingin Anda akses :
dalam kasus saya:
using App.Extensions;
dalam Controller dan@using. App.Extensions
withing .cshtml View file.EDIT:
Apa yang juga bisa Anda lakukan untuk menghindari menambahkan pernyataan menggunakan di setiap tampilan adalah pergi ke folder Views, dan cari file Web.config di sana. Sekarang cari
<namespaces>
tag dan tambahkan namespace ekstensi Anda di sana seperti:Simpan file Anda dan Anda selesai. Sekarang setiap Tampilan akan mengetahui ekstensi Anda.
Anda dapat mengakses Metode Ekstensi:
sumber
Saya mencari solusi yang sama dan Pawel memberi saya 99% jawabannya. Satu-satunya hal yang hilang yang saya perlukan untuk menampilkan ekstensi adalah menambahkan Kode Razor berikut ke halaman cshtml (view):
@using programname.Models.Extensions
Saya mencari FirstName, untuk ditampilkan di kanan atas NavBar saya setelah pengguna masuk.
Saya pikir saya akan memposting hal ini membantu orang lain, Jadi di sini adalah kode saya:
Saya membuat folder baru bernama Extensions (Under my Models Folder) dan membuat kelas baru seperti Pawel yang ditentukan di atas:
IdentityExtensions.cs
IdentityModels.cs
:Lalu di
_LoginPartial.cshtml
(Views/Shared
Folder) saya, saya menambahkan@using.ProgramName.Models.Extensions
Saya kemudian menambahkan perubahan ke baris kode berikut yang akan menggunakan nama depan pengguna setelah masuk:
@Html.ActionLink("Hello " + User.Identity.GetUserFirstname() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
Mungkin ini membantu orang lain di telepon.
sumber
Lihat posting blog yang hebat ini oleh John Atten: ASP.NET Identity 2.0: Menyesuaikan Pengguna dan Peran
Ini memiliki info langkah-demi-langkah yang hebat tentang keseluruhan proses. Bacalah:)
Berikut adalah beberapa dasar-dasarnya.
Perpanjang kelas ApplicationUser default dengan menambahkan properti baru (mis. Alamat, Kota, Negara Bagian, dll.):
Kemudian Anda menambahkan properti baru Anda ke RegisterViewModel Anda.
Kemudian perbarui Tampilan Daftar untuk memasukkan properti baru.
Kemudian perbarui metode Register () pada AccountController dengan properti baru.
sumber
Bagi siapa pun yang menemukan pertanyaan ini mencari cara mengakses properti kustom di ASP.NET Core 2.1 - itu jauh lebih mudah: Anda akan memiliki UserManager, misalnya di _LoginPartial.cshtml, dan kemudian Anda bisa melakukannya (dengan asumsi "ScreenName" adalah properti yang telah Anda tambahkan ke AppUser Anda sendiri yang diwarisi dari IdentityUser):
sumber
GetUserAsync(User)
akan meminta database untuk mengambil OrganizationId. Sebaliknya, solusi yang diterima akan memasukkan OrganizationId dalam klaim (mis. Cookie). Keuntungan menarik informasi ini dari database adalah bahwa orang dapat dipindahkan antar organisasi tanpa mengharuskan mereka keluar / masuk. Tentu saja, kerugiannya adalah membutuhkan permintaan basis data tambahan.Dhaust memberikan cara yang baik untuk menambahkan properti ke kelas ApplicationUser. Melihat kode OP tampaknya mereka mungkin telah melakukan ini atau berada di jalur untuk melakukan itu. Pertanyaan itu bertanya
Pawel memberikan cara untuk menambahkan metode ekstensi yang mengharuskan menggunakan pernyataan atau menambahkan namespace ke file web.config.
Namun, pertanyaannya bertanya apakah Anda "perlu" memperluas Pengguna. Identitas untuk menyertakan properti baru. Ada cara alternatif untuk mengakses properti tanpa memperpanjang User.Identity. Jika Anda mengikuti metode Knalpot Anda kemudian dapat menggunakan kode berikut di controller Anda untuk mengakses properti baru.
sumber
Saya juga telah menambahkan atau menambahkan kolom tambahan ke dalam tabel AspNetUsers saya. Ketika saya hanya ingin melihat data ini, saya menemukan banyak contoh seperti kode di atas dengan "Extensions" dll ... Ini benar-benar membuat saya kagum bahwa Anda harus menulis semua baris kode hanya untuk mendapatkan beberapa nilai dari pengguna saat ini.
Ternyata Anda bisa meminta tabel AspNetUsers seperti tabel lainnya:
sumber