'Login as another user' MVC 4 Windows Authentication

后端 未结 3 1948
误落风尘
误落风尘 2020-12-08 05:38

I have an intranet project written in MVC 4 which uses Windows Authentication to authorise and authenticate users.

I need to add a \'Login as another user\' function

相关标签:
3条回答
  • 2020-12-08 06:04

    This method will always log the user out and redirect to the home page. I also added [AllowAnonymous] to make sure everybody can access this method.

        [AllowAnonymous]
        public ActionResult LogOut()
        {
            HttpCookie cookie = Request.Cookies["TSWA-Last-User"];
    
            cookie = new HttpCookie("TSWA-Last-User", string.Empty)
            {
                Expires = DateTime.Now.AddYears(-5)
            };
            Response.Cookies.Set(cookie);
    
            Response.AppendHeader("Connection", "close");
            Response.StatusCode = 401; // Unauthorized;
            Response.Clear();
    
            // redirect to home
            Response.Write("<script type='text/javascript'>");
            Response.Write("var getUrl = window.location; var baseUrl = getUrl.protocol + " + 
               "'//' + getUrl.host + '/' + getUrl.pathname.split('/')[1]; window.location.href = baseUrl; ");
            Response.Write("</script>");
            Response.End();           
    
            return RedirectToAction("Index");
    
        }
    
    0 讨论(0)
  • 2020-12-08 06:14

    People reverse engineered\decompiled some code from Sharepoint that happens to have this feature.

    I tested it in an ASP.NET MVC 5 app and it's working as expected.

    The code is based on decompiling the Microsoft.TeamFoundation.WebAccess which has the "Sign in as a different User" function.

    public ActionResult LogOut()
    {
        HttpCookie cookie = Request.Cookies["TSWA-Last-User"];
    
        if(User.Identity.IsAuthenticated == false || cookie == null || StringComparer.OrdinalIgnoreCase.Equals(User.Identity.Name, cookie.Value))
        {
            string name = string.Empty;
    
            if(Request.IsAuthenticated)
            {
                name = User.Identity.Name;
            }
    
            cookie = new HttpCookie("TSWA-Last-User", name);
            Response.Cookies.Set(cookie);
    
            Response.AppendHeader("Connection", "close");
            Response.StatusCode = 401; // Unauthorized;
            Response.Clear();
            //should probably do a redirect here to the unauthorized/failed login page
            //if you know how to do this, please tap it on the comments below
            Response.Write("Unauthorized. Reload the page to try again...");
            Response.End();
    
            return RedirectToAction("Index");
        }
    
        cookie = new HttpCookie("TSWA-Last-User", string.Empty)
        {
            Expires = DateTime.Now.AddYears(-5)
        };
    
        Response.Cookies.Set(cookie);
    
        return RedirectToAction("Index");
    
    }
    

    Source:

    Force Sign in as a different user while using Windows Authentication in asp.net

    0 讨论(0)
  • 2020-12-08 06:25

    For me, working this:

     public ActionResult LogOut()
    {
        HttpCookie cookie = Request.Cookies["TSWA-Last-User"];
    
    if(User.Identity.IsAuthenticated == false || cookie == null
    {
        string name = string.Empty;
    
        if(Request.IsAuthenticated)
        {
            name = User.Identity.Name;
        }
    
        cookie = new HttpCookie("TSWA-Last-User", name);
        Response.Cookies.Set(cookie);
    
        Response.AppendHeader("Connection", "close");
        Response.StatusCode = 401; // Unauthorized;
        Response.Clear();
        //should probably do a redirect here to the unauthorized/failed login page
        //if you know how to do this, please tap it on the comments below
        Response.Write("Unauthorized. Reload the page to try again...");
        Response.End();
    
        return RedirectToAction("Index");
    }
    
    cookie = new HttpCookie("TSWA-Last-User", string.Empty)
    {
        Expires = DateTime.Now.AddYears(-5)
    };
    
    Response.Cookies.Set(cookie);
    
    return RedirectToAction("Index");
    
    }
    

    And in html

       <a href="@Url.Action("LogOut", "Home")" class="logout"><i class="fa fa-fw fa-power-off"></i> Salir</a>
    
       $(".logout").click(function () {
                logOut();
            });
    
    
        function logOut() {
            try {
                document.execCommand("ClearAuthenticationCache");
            } catch (e) { }
        }
    
    0 讨论(0)
提交回复
热议问题