دسته بندی ها
20:08 1399/12/15

پیاده سازی ReturnUrl و هدایت کاربر به مسیر دلخواه در Asp.net Core بعد از لاگین

مشخصات سوال کننده :
کاربر : pedram_khan     امتیاز کاربر : 277     رتبه کاربر : 6
دسته بندی : Asp.net Core

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 3988
هوش مصنوعی

پاسخ هوش مصنوعی

برای پیاده سازی این ویژگی در 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 در فرم قرار گرفته و پس از ورود موفق به همان آدرس برگشت داده خواهد شد.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 00:18 1399/12/16

پیاده سازی ReturnUrl و هدایت کاربر به مسیر دلخواه در Asp.net Core بعد از لاگین

این کار رو با یک مثال عملی براتون انجام میدم تا راحتتر درک کنید روش انجام کار رو 

 

چگونه کاربر را بعد از لاگین به مسیر مورد نظر هدایت کنیم ؟

  • خب ابتدا یک پروژه خالی از نوع Asp.net Core ایجاد می کنیم. در این مثال از ورژن Asp.net Core 3.1 استفاده می کنیم. با توجه به اینکه شما قصد دارید بعد از عملیات لاگین کاربر به مسیر درخواست شده قبل از لاگین هدایت شود بنابراین بهتر است که موقع ایجاد پروژه گزینه Authentication را به صورت پیش فرض فعال کنید تا فرم های ثبت نام کاربر و لاگین اتوماتیک ایجاد شود. (تصویر زیر را مشاهده کنید.)

ReturnUrl در Asp.net Core

 

  • فایل 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 تا اینجا

پیاده سازی returnurl

خب در View جدید میتوانید تگهای مورد نیاز خود را هم بنویسید. در اینجا چون به صورت تستی کار می کنیم یک متن خیلی ساده در ویوی DetailsPage می نویسیم.

 

ویوی DetailsPage.cshtml

<p>
    You Are in Details Page
</p>
  • خب حالا مجدد پروژه را اجرا کنید و از طریق فرم لاگین وارد سیستم شوید و بعد از لاگین به مسیر زیر بروید
https://localhost:44367/Home/DetailsPage

مشاهده می کنید که این صفحه نمایش داده می شود.

لاگین کردن در asp core

خب حالا 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 ذخیره میشه تا بعد از لاگین از اون استفاده بشه.

 

دانلود سورس

به این پاسخ امتیاز بدهید    0
امتیاز: 1635 رتبه: 2
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود