Saya sedang mengembangkan aplikasi web MVC 5 menggunakan pendekatan Entity Framework 5 Database First . Saya menggunakan OWIN untuk otentikasi Pengguna. Di bawah ini menunjukkan metode Login saya dalam Pengontrol Akun saya.
public ActionResult Login(LoginViewModel model, string returnUrl)
{
if (ModelState.IsValid)
{
var user = _AccountService.VerifyPassword(model.UserName, model.Password, false);
if (user != null)
{
var identity = new ClaimsIdentity(new[] { new Claim(ClaimTypes.Name, model.UserName), }, DefaultAuthenticationTypes.ApplicationCookie, ClaimTypes.Name, ClaimTypes.Role);
identity.AddClaim(new Claim(ClaimTypes.Role, "guest"));
identity.AddClaim(new Claim(ClaimTypes.GivenName, "A Person"));
identity.AddClaim(new Claim(ClaimTypes.Sid, user.userID)); //OK to store userID here?
AuthenticationManager.SignIn(new AuthenticationProperties
{
IsPersistent = model.RememberMe
}, identity);
return RedirectToAction("Index", "MyDashboard");
}
else
{
ModelState.AddModelError("", "Invalid username or password.");
}
}
// If we got this far, something failed, redisplay form
return View(model);
}
Seperti yang Anda lihat, saya sedang membuat ClaimsIdentity dan menambahkan beberapa klaim ke dalamnya, lalu meneruskannya ke OWIN menggunakan AuthenticationManager untuk masuk.
Masalah yang saya hadapi adalah saya tidak yakin bagaimana cara mengakses klaim di seluruh aplikasi saya, baik di Controllers atau di Razor Views.
Saya telah mencoba pendekatan yang tercantum dalam tutorial ini
Misalnya, saya mencoba ini di kode Pengontrol saya dalam upaya untuk mendapatkan akses ke nilai yang diteruskan ke Klaim, namun, pengguna. Klaim sama dengan null
var ctx = HttpContext.GetOwinContext();
ClaimsPrincipal user = ctx.Authentication.User;
IEnumerable<Claim> claims = user.Claims;
Mungkin saya melewatkan sesuatu di sini.
MEMPERBARUI
Berdasarkan jawaban Darin, saya menambahkan kodenya tetapi tetap saja saya gagal melihat akses ke Klaim. Silakan lihat tangkapan layar di bawah ini yang menunjukkan apa yang saya lihat ketika mengarahkan kursor ke atas identitas.
Jawaban:
Coba ini:
sumber
Anda juga bisa melakukan ini:
Memperbarui
Untuk memberikan penjelasan lebih lanjut sesuai komentar.
Jika Anda membuat pengguna dalam sistem Anda sebagai berikut:
Anda akan secara otomatis memiliki beberapa Klaim yang terkait dengan Identitas Anda.
Untuk menambahkan klaim yang disesuaikan setelah pengguna mengautentikasi, Anda dapat melakukan ini sebagai berikut:
Klaim tersebut dapat dibaca kembali seperti yang telah dijawab oleh Darin di atas atau seperti yang saya lakukan.
Klaim dipertahankan ketika Anda menelepon di bawah ini meneruskan identitas di:
sumber
Saya membuat kelas tambahan saya sendiri untuk melihat apa yang saya butuhkan, jadi ketika saya perlu ke controller atau View saya, saya hanya menambahkan use ke namespace saya seperti ini:
Di pengontrol saya:
Di pisau cukur saya:
sumber
return claim?.Value;
karena mengapa tidakIni adalah alternatif jika Anda tidak ingin menggunakan klaim sepanjang waktu. Lihat tutorial ini oleh Ben Foster.
Kemudian Anda dapat menambahkan pengontrol dasar.
Di pengontrol Anda, Anda akan melakukan:
sumber
Untuk lebih lanjut menyentuh jawaban Darwin, Anda dapat memperoleh klaim spesifik Anda dengan menggunakan metode FindFirst :
sumber
Anda juga bisa melakukan ini.
sumber
Ingatlah bahwa untuk menanyakan IEnumerable Anda perlu mereferensikan system.linq.
Ini akan memberi Anda objek ekstensi yang perlu dilakukan:
sumber
versi jawaban @Rosdi Kasim'd yang paling singkat dan disederhanakan adalah
Claimname
adalah klaim yang ingin anda ambil, yaitu jika anda mencari klaim "StreedAddress" maka jawaban di atas akan seperti inisumber
Namun lebih baik menambahkan klaim di dalam metode "GenerateUserIdentityAsync", terutama jika regenerateIdentity di Startup.Auth.cs diaktifkan.
sumber
GenerateUserIdentityAsync
adalah saran yang luar biasa, saya benar-benar telah mengabaikannya. Terima kasih banyak, Basil.Menurut kelas ControllerBase, Anda bisa mendapatkan klaim untuk pengguna yang menjalankan tindakan.
inilah cara Anda melakukannya dalam 1 baris.
sumber
sumber
Saya menggunakannya seperti itu di pengontrol dasar saya. Hanya berbagi untuk siap digunakan.
sumber