پیاده سازی ReturnUrl و هدایت کاربر به مسیر دلخواه در Asp.net Core بعد از لاگین
دوستان چجوری میتونم از دستور ReturnUrl در Asp.net Core استفاده کنم ؟ میخوام اگر کاربر لاگین نکرده و آدرسی رو در Url مرورگر وارد کرد که نیاز به لاگین کردن داشت به صفحه Login هدایت بشه و بعد از Login اتوماتیک به همون مسیر اول که درخواست کرده بود هدایت بشه.
پاسخ هوش مصنوعی
برای پیاده سازی این ویژگی در ASP.NET Core، شما باید URL مورد نظر را به عنوان پارامتر به صفحه لاگین ارسال کنید و پس از ورود موفق، کاربر را به آن URL هدایت کنید. در زیر مراحلی که باید دنبال کنید را توضیح می دهم:
1. **تنظیم مسیر دسترسی:** در کنترلری که محتوای نیاز به احراز هویت دارد، از ویژگی Authorize استفاده کنید. این ویژگی باعث می شود کاربرانی که هنوز لاگین نکرده اند به صفحه لاگین هدایت شوند.
[Authorize]
public class MyProtectedController : Controller
{
public IActionResult MyProtectedAction()
{
return View();
}
}
2. **تنظیم صفحه لاگین:** در اکشن لاگین، می توانید آدرس بازگشتی را از URL استخراج کنید و پس از ورود موفق، کاربر را به آن URL هدایت کنید. به عنوان مثال:
[HttpGet]
public IActionResult Login(string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
return View();
}
[HttpPost]
public async Task Login(LoginViewModel model, string returnUrl = null)
{
if (ModelState.IsValid)
{
// بررسی اعتبار و ورود کاربر
// اگر ورود موفق بود، کاربر را به returnUrl هدایت کنید
var result = await _signInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, lockoutOnFailure: false);
if (result.Succeeded)
{
return LocalRedirect(returnUrl ?? Url.Content("~/"));
}
// در غیر این صورت، پیغام خطا را نمایش دهید
ModelState.AddModelError(string.Empty, "ورود ناموفق");
}
// اگر چیزی اشتباه است، دوباره صفحه ورود را نمایش دهید
return View(model);
}
3. **ایجاد نمای لاگین:** در نمای صفحه لاگین، URL بازگشتی را به عنوان ورودی مخفی اضافه کنید:
@model LoginViewModel
با این کار، وقتی که کاربر به صفحه لاگین هدایت شود، آدرسی که درخواست کرده بود به عنوان returnUrl در فرم قرار گرفته و پس از ورود موفق به همان آدرس برگشت داده خواهد شد.
پیاده سازی ReturnUrl و هدایت کاربر به مسیر دلخواه در Asp.net Core بعد از لاگین
این کار رو با یک مثال عملی براتون انجام میدم تا راحتتر درک کنید روش انجام کار رو
چگونه کاربر را بعد از لاگین به مسیر مورد نظر هدایت کنیم ؟
- خب ابتدا یک پروژه خالی از نوع Asp.net Core ایجاد می کنیم. در این مثال از ورژن Asp.net Core 3.1 استفاده می کنیم. با توجه به اینکه شما قصد دارید بعد از عملیات لاگین کاربر به مسیر درخواست شده قبل از لاگین هدایت شود بنابراین بهتر است که موقع ایجاد پروژه گزینه Authentication را به صورت پیش فرض فعال کنید تا فرم های ثبت نام کاربر و لاگین اتوماتیک ایجاد شود. (تصویر زیر را مشاهده کنید.)
- فایل appsettings.json را باز کنید. در این فایل Connection String برای ارتباط با دیتابیس وجود دارد. با توجه به مشخصات سرور و دیتابیس خود این کانکشن استرینگ را تنظیم کنید. در پروژه ما کانکشن استرینگ به صورت زیر می باشد.
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=ReturnUrlDB; user Id=sa; Password= 1;"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
- حالا برای ایجاد دیتابیس در Sql Server یک مایگریشن ایجاد کنید و سپس دیتابیس را در Sql Server ایجاد کنید.
- پروژه را اجرا کنید و از طریق فرم Register یک کاربر ثبت کنید. سپس از طریق فرم Login یکبار عملیات لاگین را انجام دهید تا مطمئن شوید که پروژه به درستی کار می کند.
- کنترلر Home را باز کنید و یک اکشن جدید در آن ایجاد کنید. نام این اکشن را به عنوان مثال DetailsPage می گذاریم. سپس یک View در پوشه Home همنام با این اکشن ایجاد کنید. در بالای این اکشن از ویژگی Authorized استفاده کنید. به این معنی که دسترسی به این اکشن نیازمند احراز هویت یا همان لاگین می باشد.
[Authorize]
public IActionResult DetailsPage()
{
return View();
}
نمایی از Solution تا اینجا
خب در View جدید میتوانید تگهای مورد نیاز خود را هم بنویسید. در اینجا چون به صورت تستی کار می کنیم یک متن خیلی ساده در ویوی DetailsPage می نویسیم.
ویوی DetailsPage.cshtml
<p>
You Are in Details Page
</p>
- خب حالا مجدد پروژه را اجرا کنید و از طریق فرم لاگین وارد سیستم شوید و بعد از لاگین به مسیر زیر بروید
https://localhost:44367/Home/DetailsPage
مشاهده می کنید که این صفحه نمایش داده می شود.
خب حالا Logout کنید و مجدد به همین مسیر بروید. مشاهده می کنید که به صورت اتوماتیک به صفحه Login هدایت می شوید. اگر در آدرس مرورگر نگاه کنید چیزی مشابه با زیر مشاهده خواهید کرد.
https://localhost:44367/Identity/Account/Login?ReturnUrl=%2FHome%2FDetailsPage
در تصویر زیر هم میتوانید خروجی را مشاهده کنید.
مشاهده می کنید که به صورت اتوماتیک به صفحه لاگین هدایت شدیم و در آدرس ReturnUrl وجود دارد و آدرس صفحه درخواست شده هم در آن موجود می باشد. بعد از لاگین هم اتوماتیک به صفحه مورد نظر هدایت می شوید. بنابراین اگر شما در پروژه خود از Authentication به صورت پیش فرض استفاده کرده باشید خاصیت ReturnUrl اتوماتیک فعال می باشد.
پیاده سازی ReturnUrl به صورت کاستومایز شده (به صورت دستی)
خب حالا اگر شما در پروژه خودتون به صورت پیش فرض از Authentication استفاده نکردید و به صورت دستی به وجود آوردید میتونید توی ویوی Login خودتون از asp-route استفاده کنید. برای این منظور در form لاگین دستور زیر را بنویسید :
<form asp-controller="Account" asp-action="Login" asp-route-returnurl="@ViewBag.returnurl" method="post">
</fotm>
همچنین در کنترلر Account و اکشن Login هم به این صورت عملی کنید.
public class AccountController : Controller
{
private readonly UserManager<IdentityUser> _userManager;
private readonly SignInManager<IdentityUser> _signInManager;
public AccountController(UserManager<IdentityUser> userManager, SignInManager<IdentityUser> signInManager)
{
_userManager = userManager;
_signInManager = signInManager;
}
public IActionResult Login(string returnurl)
{
ViewBag.returnurl = returnurl;
return View();
}
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Login(LoginViewModel model, string returnurl = "")
{
if (ModelState.IsValid)
{
var user = await _userManager.FindByNameAsync(model.UserName);
if (user == null)
{
ViewBag.errorMesasge = "Invalid UserName Or Password";
return View();
}
else
{
var result = await _signInManager.PasswordSignInAsync(user.UserName, model.Password, true, lockoutOnFailure: true);
if (result.Succeeded)
{
if (returnurl != null)
{
//returnurl
return Redirect("https://localhost:44306" + returnurl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
}
}
else
{
return View(model);
}
return View("Login");
}
}
خب در این صورت هر موقع قصد دسترسی به اکشنی رو داشته باشید که نیاز به Authorize داشت اتوماتیک به اکشن Login هدایت میشه و مقدار returnurl هم در متغیر returnurl ذخیره میشه تا بعد از لاگین از اون استفاده بشه.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- کار با CkEditor با قابلیت آپلود عکس
- خطا در ایجاد migration در Asp.net core
- تفاوت های Asp.net core و Asp.net mvc چیه؟
- دلیل اسپم شدن ایمیل های ارسالی از سرور
- نحوه لایه بندی پروژه Core و اضافه کردن به IIS
- ارسال ایمیل در Asp.net core
- آیا میشه در mvc core از کامپونت استفاده کرد
- آپلود فایل در Asp.net core چگونه است؟
- حذف کامل یک رکورد در جدول ریلیشن شده
- اشکال در آپلود فایل ویدیو در mvc core 2