تعریف logoff در فرمهای MVC

10/11/2016 MVC
1348

به صورت عمومی زمانی که یک پروژه  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;
            }
        }

را به انتهای کد بالا اضافه  میکنیم