به صورت عمومی زمانی که یک پروژه MVC را ایجاد میکنید برای احراز هویت کاربر از
@Html.Partial("_LoginPartial")
در _Layout.cshtml استفاده میکنیم ، حال من میخواستم همین کار را در area انجام دهم
به صورت پییش فرض اکشن مربوط به Login و Logoff در کنترل Account در روت پروژه وجد دارد ، حال اگر بخواهیم این کار را در Area دیگری انجام دهیم باید یه سری کارها را نجام دهیم
اول اینکه در Layout_ که در area ایجاد کرده ایم کد مربوط به Partial را جای گذاری میکنیم
@Html.Partial("_LoginPartial")
اگر LoginPartial_ را د رکنار Layout_ در area ایجاد نکرده باشیم به صورت پیشفرض از LoginPartial_ موجود در root پروژه استفاده میکند.
و باید تغییراتی در آن ایجاد کنید ، البته این در صورتی است که قرار باشد هم در صفحه اصلی سایت و هم در area بعد از login به یک مسیر کاربر را هدایت کنید کار ساز خواهد بود ، اما در صورتی که بخواهید دو logout به صورت مجزا باشند باید یک partialView جدا گانه نیز در پوشه Shared موجود در area ایجاد کنیم. و کد آن را به این صورت تغییر دهیم
@using Microsoft.AspNet.Identity
@if (Request.IsAuthenticated)
{
using (Html.BeginForm("LogOff", "Home", FormMethod.Post, new { id = "logoutForm", @class = "navbar-left" }))
{
@Html.AntiForgeryToken()
<ul class="nav navbar-nav navbar-left">
<li>
@Html.ActionLink("Hello " + User.Identity.GetUserName() + "!", "Index", "Manage", routeValues: null, htmlAttributes: new { title = "Manage" })
</li>
<li><a href="javascript:document.getElementById('logoutForm').submit()">Log off</a></li>
</ul>
}
}
else
{
<ul class="nav navbar-nav navbar-left">
<li>@Html.ActionLink("ثبت نام", "Register", "Account", routeValues: new {area=""}, htmlAttributes: new { id = "registerLink" })</li>
<li>@*@Html.ActionLink("Log in", "Login", "Account", routeValues: null, htmlAttributes: new { id = "loginLink" })*@</li>
</ul>
}
اضافه کردن کد در کنترلر Home
// POST: /Account/LogOff
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogOff()
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
return RedirectToAction("Index", "Home");
}
در اینجا خطایی رخ خواهد داد که
'AuthenticationManager' does not contain a definition for 'SignOut'
برای حل آن مشکل کد
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
را به انتهای کد بالا اضافه میکنیم