View Full Version : سوال: نمایش کاربران آنلاین و بلاک کردن کاربران در Identity 2
alibahman47
دوشنبه 09 مرداد 1396, 10:44 صبح
درود ,
دوتا سوال در مورد Identity 2 :
1 - چطوری میشه یک کاربر رو غیر فعال یا بلاک کرد که نتونه دیگه به سایت وارد بشه و اگر هم تو سایت باشه آنی Logout بشه ؟
تو StackOverFlaow چند مورد رو تست کردم ولی جواب نگرفتم - فیلد IsEnabled رو هم به جدول کاربران اضافه کردم که در پایین میبینید- اگه امکان داره یکم به زبان شیرین فارسی توضیح بدید.
2 -چطور میشه فهمید که چه کاربری آنلاینه و چه کاربری آفلاین ؟
فیلد های زیر کاربردشون چیه ؟
http://s9.picofile.com/file/8302139168/Iden.png
Moien Tajik
دوشنبه 09 مرداد 1396, 14:39 عصر
1- 2 فیلد LockoutEndDateUtc و LockoutEnabled برای همین ساخته شده و نیازی به فیلد اضافه IsEnabled نیست .
کد کنترلر برای Ban و UnBan کردن یک کاربر که ورودی userid کاربر رو میگیره :
public async Task<ActionResult> LockAccount([Bind(Include = "Id")] string id)
{
await UserManager.ResetAccessFailedCountAsync(id);
await UserManager.SetLockoutEndDateAsync(id, DateTime.UtcNow.AddYears(100));
return RedirectToAction("Index");
}
public async Task<ActionResult> UnlockAccount([Bind(Include = "Id")] string id)
{
await UserManager.ResetAccessFailedCountAsync(id);
await UserManager.SetLockoutEndDateAsync(id, DateTime.UtcNow.AddYears(-1));
return RedirectToAction("Index");
}
کد ویو :
@*Unlocked*@
@if (Model.LockoutEnabled && (Model.LockoutEndDateUtc <= DateTime.Now || Model.LockoutEndDateUtc == null))
{
<div class="col-md-10">
<p class="form-control-static">Active</p>
</div><br /><br /><br />
<div class="col-md-offset-2">
@using (Html.BeginForm("LockAccount", "ApplicationUsers", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.HiddenFor(model => model.Id)
<input type="submit" value="Ban User" class="btn btn-danger" />
}
</div><br /><br />
}
@*Locked*@
@if (Model.LockoutEnabled && (Model.LockoutEndDateUtc > DateTime.Now))
{
<div class="col-md-10">
<p class="form-control-static">
<span>@Model.LockoutEndDateUtc</span>
<span dir="rtl"> Banned till </span>
</p>
</div><br /><br />
<div class="col-md-offset-2">
@using (Html.BeginForm("UnlockAccount", "ApplicationUsers", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary()
@Html.HiddenFor(model => model.Id)
<input type="submit" value="Unban User" class="btn btn-success" />
}
</div><br /><br />
}
2- برای اینکه بفهمید یک کاربر آنلاین شده ، باید از Application_Start و Application_End در Global.Asax استفاده کنید .
وقت کاربر لاگین کرد ، UserId اش رو بگیرید و در Start وضعیتش رو به آنلاین تغییر بدید ( یک Property جدید باید برای آنلاین بود کاربر تعریف کنید ) و در Application_End این Property رو False به معنی آفلاین تغییر بدید .
روش های دیگه ای هم برای انجام این کار هست :
https://stackoverflow.com/a/23379616
https://www.codeproject.com/Articles/1080698/How-To-Show-Currently-Online-Users-Members-Using-A
alibahman47
دوشنبه 16 مرداد 1396, 12:32 عصر
آقای تاجیک میخوام اگر کاربر به سیستم لاگین کرده باشه و بعد block شد به صورت اتوماتیک از سیستم LogOut بشه .
کد زیر در ابتدای صفحه _layout گذاشتم :
چه کدی رو در خط 93 بنویسم که با اجرا شدن این قسمت کاربر از سیستم لاگ اوت بشه ؟
Moien Tajik
دوشنبه 16 مرداد 1396, 13:24 عصر
بنده هم قبلا میخواستم همچین چیزی رو در Identity پیاده سازی کنم ، قبلا هم در Stackoverflow مطرح کردم که به نتیجه نرسید : https://stackoverflow.com/q/38689807
روش هایی برای انجام اینکار در Membership هست اما Identity من چیزی پیدا نکردم : https://stackoverflow.com/a/3098840
alibahman47
دوشنبه 16 مرداد 1396, 15:53 عصر
یعنی شما روشی برای Log Out کردن کاربر در صورتی که فیلد
LockoutEnabled مربوط به آن کاربر مقدار True را داشته باشد را سراغ ندارید ؟ حالا به هر سبک و روشی ؟
قطعلا در قسمتی از این Identity کوفتی بخشی هست که در هر رفرش باید درست بودن یوزنیم و لاگین کاربر چک شود - البته خوب Identity از کوکی برای این کار استفاده میکند و فکر کنم همین کار را انقدر سخت کرده است.
والا من کارهایی 100 برابر ازین قوی تر را در membership انجام دادم و هرتور که میخواستم طراحی رو کاستومایز میکردم ,
متاسفانه در پروژه جاری که سه ماه پیش کلیک خورد اومدم از Identity برای این کار استفاده کردم (که فکر کنم بزرگترین اشتباه زندگیم بود)
درحالی دانش کافیش ر وهم نداشتم و حالا هم بدجوری داغونم کرده - دوهفته دیگه باید پروژه رو تحویل بدم و با این وضعیت نمیدونم چیکارش کنم -
هر قسمتیش رو میخوام توسعه بدم باید یک هفته سرچ کنم تا دو خط کد بهش اضافه کنم .درحالی که در قسمت های دیگه پروژم شده که در دور روز تا 4000 خط کد رو برای تکمیل بخشی بنویسم - نه اینکه بگم کد زیاد نوشتن دلیل ب بهتر بودن پروژه هست ولی در کل کلاس کاری پروژه و امکاناتش فوق العاده بالاتر ازین
Identity مسخره است .
بنظرم تنها کاربرش برای کسایی هست که نمیتونن خودشون کد بزنن و میان ازین روش ها استفاده میکنن.
Moien Tajik
دوشنبه 16 مرداد 1396, 18:03 عصر
خط 93 این کد رو بزارید :
AuthenticationManager.SignOut(DefaultAuthenticatio nTypes.ApplicationCookie);
alibahman47
دوشنبه 16 مرداد 1396, 20:35 عصر
خط 93 این کد رو بزارید :
AuthenticationManager.SignOut(DefaultAuthenticatio nTypes.ApplicationCookie);
ممنون:
http://s8.picofile.com/file/8302866384/CCCCc.png
Name Space های رو نشون نمیده که بتونم اضافشون کنم . به چه Name Space های نیاز هست ؟
Moien Tajik
دوشنبه 16 مرداد 1396, 20:51 عصر
اول از همه Resharper رو نصب کنید که هیچوقت درگیر پیدا کردن نام Assembly ها نشید.
تو AccountController از این کد برای Logout استفاده شده ، این رفرنس هارو اضافه کنید :
using System;
using System.Globalization;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
RIG000
دوشنبه 16 مرداد 1396, 21:13 عصر
آقای تاجیک میخوام اگر کاربر به سیستم لاگین کرده باشه و بعد block شد به صورت اتوماتیک از سیستم LogOut بشه .
کد زیر در ابتدای صفحه _layout گذاشتم :
چه کدی رو در خط 93 بنویسم که با اجرا شدن این قسمت کاربر از سیستم لاگ اوت بشه ؟
در عمل یا کوکی رو باید رو تایمرش بذارید و منتظر تایمر باشه که وقتی اکسپایر شد بعد دیگه بسته به رولی که نداره وارد نشه و ...
ویا در نظر بگیر رولش گرفته شده یا بهش اضافه شده و ... به ازای هر خواست این رولش رو چک بکنید که اگر نداشت دیگه کاری که میخاین انجام بگیره. مثلا تو صفحه ای هست و حالا رولش گرفته شده و شما میخاین دیگه کامنت نذاره ... که وقتی درخواست کامنت رو فرستاد claim هاش بررسی بشه واگر qualification نبود دسترسیش رو ازش بگیری.
alibahman47
سه شنبه 17 مرداد 1396, 00:07 صبح
اول از همه Resharper رو نصب کنید که هیچوقت درگیر پیدا کردن نام Assembly ها نشید.
تو AccountController از این کد برای Logout استفاده شده ، این رفرنس هارو اضافه کنید :
using System;
using System.Globalization;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security;
نصبکردم-اول ازهمه نصب میکنم - قبلاخودتون توصیش کردید.ممنون
در کنترولر هم همه این ها وجود داشت - منظورم در VIew بود - چون این کد ویو خطا میده .
alibahman47
سه شنبه 17 مرداد 1396, 00:22 صبح
در عمل یا کوکی رو باید رو تایمرش بذارید و منتظر تایمر باشه که وقتی اکسپایر شد بعد دیگه بسته به رولی که نداره وارد نشه و ...
ویا در نظر بگیر رولش گرفته شده یا بهش اضافه شده و ... به ازای هر خواست این رولش رو چک بکنید که اگر نداشت دیگه کاری که میخاین انجام بگیره. مثلا تو صفحه ای هست و حالا رولش گرفته شده و شما میخاین دیگه کامنت نذاره ... که وقتی درخواست کامنت رو فرستاد claim هاش بررسی بشه واگر qualification نبود دسترسیش رو ازش بگیری.
اگه مدت زمان انقضای کوکی روکم بزارم که زود به زود چک بشه این باعث میشه همه کاربرا اذیت بشن وهی نیاز به لاگین داشته باشن.
ولی در نهایت اگه مجبور بشم فکر کنم دادن یک Role خاص مثلا Block به کاربر موردنظر کار عاقلانه تری هست و فکر کنم جواب بده .
فقط باید همه دسترسی ها رو برای این Role ببندم.
ممنون .
Moien Tajik
سه شنبه 17 مرداد 1396, 00:45 صبح
لازم نیست حتما تو View هندل کنیدش ، داخل اکشن در کنترلر میتونید در Constructor و یا داخل Get اکشن چک کنید اگر کاربر LockoutEnabled اش فعال بود و باقی شرط ها که براتون فرستادم رو داشت ، کاربر رو از طریق اکشن Logout کنید .
داخل View بهتره کمتر کدهایی رو که با Logic برنامه سرکار دارن بنویسید و همچین کدهایی رو داخل اکشن اجرا کنید .
alibahman47
سه شنبه 17 مرداد 1396, 16:06 عصر
لازم نیست حتما تو View هندل کنیدش ، داخل اکشن در کنترلر میتونید در Constructor و یا داخل Get اکشن چک کنید اگر کاربر LockoutEnabled اش فعال بود و باقی شرط ها که براتون فرستادم رو داشت ، کاربر رو از طریق اکشن Logout کنید .
داخل View بهتره کمتر کدهایی رو که با Logic برنامه سرکار دارن بنویسید و همچین کدهایی رو داخل اکشن اجرا کنید .
من هم از نوشتن کد ها در View کلا خودداری میکنم و همینطور تا حد امکان با کلاس و کد های ریپوزیتوری کار رو انجام میدم ولی این مورد فرق دارد ,
من این کد رو هم از روش نوشن در ریپوزیتوری و فراخوانی آن در ابتدای _Layout و هم نوشتن آن در کنترولر تست کردم - کلا خطا میده !!
http://s9.picofile.com/file/8302942876/Web.png
Moien Tajik
سه شنبه 17 مرداد 1396, 16:08 عصر
فاصله بین Authentication رو بردارید ، تو ادیتور اینجا که بنده فرستادم با فاصله افتاده ، نباید فاصله داشت باشن ، به این شکل :
DefaultAuthenticationTypes.ApplicationCookie
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.