Frage

Ich habe ein Szenario, wobei ich Benutzer benötigen, um zu sein Web-Anwendung zur Authentifizierung gegen eine ASP.NET MVC entweder Windows-Authentifizierung oder die Formularauthentifizierung verwendet wird. Wenn der Benutzer im internen Netzwerk ist, werden sie die Windows-Authentifizierung verwenden, und wenn sie eine Verbindung herstellen außen werden sie Formularauthentifizierung verwenden. Ich habe schon einige Leute gesehen, die Frage zu stellen, wie konfiguriere ich eine ASP.NET MVC Web-Anwendung für diese, aber ich habe festgestellt, keine vollständige Erklärung.

Bitte kann mir jemand eine detaillierte Erklärung liefern, mit Codebeispielen, wie dies würde geschehen?

Danke.

Alan T

War es hilfreich?

Lösung

Dies wird gemischten Authentifizierungsmodus genannt. Grundsätzlich kann man nicht erreicht dies innerhalb einer Single Anwendung, weil in IIS, wenn Sie die Windows-Authentifizierung für ein virtuelles Verzeichnis einrichten wird es nicht mehr Anwender aus unterschiedlichen Domänen akzeptieren. Also im Grunde brauchen Sie zwei Anwendungen haben, die erste mit Windows-Authentifizierung und die zweite (die Hauptanwendung) unter Verwendung von Formularauthentifizierung. Die erste Anwendung einer einzigen Adresse bestehen, die einfach an der Hauptanwendung umleitet, indem ein Authentifizierungsticket für den Domain-Benutzer ausgegeben wird.

Andere Tipps

Dies kann durchgeführt werden. Kehren Sie die Konfiguration, setzen Sie das app / root verwenden Anonymous und Formularauthentifizierung ... Auf diese Weise können Sie gemischte Authentifizierung innerhalb der Web-Anwendung konfigurieren, aber es ist schwierig. Also zuerst konfigurieren Sie App für die Formularauthentifizierung mit loginUrl = „~ / WinLogin / WinLogin2.aspx“. In MVC gesetzt, Routing-Überschreibungen Authentifizierungsregeln von IIS, so Notwendigkeit, eine aspx Seite zu verwenden, da die IIS-Authentifizierung auf der Datei festlegen kann. Aktivieren Anonymous und Formularauthentifizierung auf der Stamm-Web-Anwendung. Aktivieren Sie die Windows-Authentifizierung, und deaktivieren Sie die anonyme Authentifizierung in root / WinLogin-Verzeichnis. Fügen Sie benutzerdefinierte 401 und 401,2 Fehlerseiten zum Konto umleiten zurück / Signin URL.

Dies wird mit jedem Browser verwenden integrierte Windows-Authentifizierung auf Auto signin erlaubt Passthrough zu fähig ist. Während einige Geräte für Anmeldeinformationen erhalten Sie dazu aufgefordert (wie iPhone) und andere Geräte wie Blackberry zu signin Seite umgeleitet.

Dies schafft auch einen Cookie explizit das Hinzufügen der Benutzer-Rollen und schafft eine generische Prinzip, so dass rollenbasierte Autorisierung verwendet werden kann.

in WinLogin2.aspx (in WinLogin-Verzeichnis unter „root“ Web-Anwendung in IIS, und konfiguriert die Windows-Authentifizierung zu verwenden, Anonymous deaktiviert und Formulare aktiviert ist (wie nicht ausschalten kann ... IIS Notiz wird sich beschweren, wenn Sie ermöglichen Windows-Authentifizierung, einfach ignorieren):

var logonUser = Request.ServerVariables["LOGON_USER"];
        if (!String.IsNullOrWhiteSpace(logonUser))
        {
            if (logonUser.Split('\\').Length > 1)
            {
                var domain = logonUser.Split('\\')[0];
                var username = logonUser.Split('\\')[1];

                var timeout = 30;

                var encTicket = CreateTicketWithSecurityGroups(false, username, domain, timeout);

                var authCookie = new HttpCookie(".MVCAUTH", encTicket) { HttpOnly = true };
                Response.Cookies.Add(authCookie);


            }
            //else
            //{
            // this is a redirect due to returnUrl being WinLogin page, in which logonUser will no longer have domain attached
            //  ignore as forms ticket should already exist
            //}

            string returnUrl = Request.QueryString["ReturnUrl"];

            if (returnUrl.IsEmpty())
            {
                Response.Redirect("~/");
            }
            else
            {
                Response.Redirect(returnUrl);
            }
        }

        public static string CreateTicketWithSecurityGroups(bool rememberMe, string username, string domain, int timeout)
    {
        using (var context = new PrincipalContext(ContextType.Domain, domain))
        {
            using (var principal = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, username))
            {
                var securityGroups = String.Join(";", principal.GetAuthorizationGroups());

                var ticket =
                    new FormsAuthenticationTicket(1,
                                                  username,
                                                  DateTime.UtcNow,
                                                  DateTime.UtcNow.AddMinutes(timeout),
                                                  rememberMe,
                                                  securityGroups,
                                                  "/");

                string encTicket = FormsAuthentication.Encrypt(ticket);
                return encTicket;
            }
        }
    }

In IIS 7.5, Fehlerseiten klicken, stellen Sie die 401 Seite Dateipfad von Redirect401.htm Datei, mit diesem Code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org /TR/xhtml1/DTD/xhtml1-transitional.dtd">

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
       <title></title>
        <script>
           window.location.assign('../Account/Signin');
      </script>
   </head>
  <body>

  </body>
   </html>

In Account ...

public ActionResult SignIn()
    {
        return View(new SignInModel());
    }

    //
    // POST: /Account/SignIn

    [HttpPost]
    public ActionResult SignIn(SignInModel model, string returnUrl)
    {
        if (ModelState.IsValid)
        {
            if (Membership.ValidateUser(model.UserName, model.Password))
            {
                string encTicket = CreateTicketWithSecurityGroups(model.RememberMe,  model.UserName, model.Domain, FormsAuthentication.Timeout.Minutes);

                Response.Cookies.Add(new HttpCookie(".MVCAUTH", encTicket));

                //var returnUrl = "";
                for (var i = 0; i < Request.Cookies.Count; i++)
                {
                    HttpCookie cookie = Request.Cookies[i];
                    if (cookie.Name == ".MVCRETURNURL")
                    {
                        returnUrl = cookie.Value;
                        break;
                    }
                }

                if (returnUrl.IsEmpty())
                {
                    return Redirect("~/");
                }

                return Redirect(returnUrl);
            }

            ModelState.AddModelError("Log In Failure", "The username/password combination is invalid");
        }

        return View(model);
    }

    //
    // GET: /Account/SignOut

    public ActionResult SignOut()
    {
        FormsAuthentication.SignOut();

        if (Request.Cookies[".MVCRETURNURL"] != null)
        {
            var returnUrlCookie = new HttpCookie(".MVCRETURNURL") { Expires = DateTime.Now.AddDays(-1d) };
            Response.Cookies.Add(returnUrlCookie);
        }

        // Redirect back to sign in page so user can 
        //   sign in with different credentials

        return RedirectToAction("SignIn", "Account");

In global.asax:

protected void Application_BeginRequest(object sender, EventArgs e)
    {


        try
        {
            bool cookieFound = false;

            HttpCookie authCookie = null;

            for (int i = 0; i < Request.Cookies.Count; i++)
            {
                HttpCookie cookie = Request.Cookies[i];
                if (cookie.Name == ".MVCAUTH")
                {
                    cookieFound = true;
                    authCookie = cookie;
                    break;
                }
            }

            if (cookieFound)
            {
                // Extract the roles from the cookie, and assign to our current principal, which is attached to the HttpContext.
                FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
                HttpContext.Current.User = new GenericPrincipal(new FormsIdentity(ticket), ticket.UserData.Split(';'));
            }



        }
        catch (Exception ex)
        {
            throw;
        }

    }


     protected void Application_AuthenticateRequest()
    {
        var returnUrl = Request.QueryString["ReturnUrl"];
        if (!Request.IsAuthenticated &&
            !String.IsNullOrWhiteSpace(returnUrl))
        {
            var returnUrlCookie = new HttpCookie(".MVCRETURNURL", returnUrl) {HttpOnly = true};
            Response.Cookies.Add(returnUrlCookie);
        }
    }

web.config

<!--<authorization>
  <deny users="?"/>
</authorization>-->
<authentication mode="Forms">
  <forms name=".MVCAUTH" loginUrl="~/WinLogin/WinLogin2.aspx" timeout="30" enableCrossAppRedirects="true"/>
</authentication>
<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
  <providers>
    <add name="AspNetActiveDirectoryMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider,           System.Web, Version=4.0.0.0, Culture=neutral,           PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADService" connectionProtection="Secure" enablePasswordReset="false" enableSearchMethods="true" requiresQuestionAndAnswer="true" applicationName="/" description="Default AD connection" requiresUniqueEmail="false" clientSearchTimeout="30" serverSearchTimeout="30" attributeMapPasswordQuestion="department" attributeMapPasswordAnswer="division" attributeMapEmail="mail" attributeMapUsername="sAMAccountName" maxInvalidPasswordAttempts="5" passwordAttemptWindow="10" passwordAnswerAttemptLockoutDuration="30" minRequiredPasswordLength="7" minRequiredNonalphanumericCharacters="1"/>
  </providers>
</membership><machineKey decryptionKey="..." validationKey="..." />  </system.web><connectionStrings> <add name="ADService" connectionString="LDAP://SERVER:389"/></connectionStrings>

Kredit verdankte http://msdn.microsoft.com/en-us /library/ms972958.aspx

Dies wird wahrscheinlich bei der Unterseite dieser Frage und nie gefunden werden, aber ich war in der Lage zu implementieren, was auf beschrieben wurde

http://mvolo.com / iis-70-twolevel-Authentifizierung mit-forms-authentication-und-windows-Authentifizierung /

Es war ganz einfach und trivial. Bedurften nicht mehr Anwendungen oder Cookie-Hacks, sondern nur die FormsAuthModule erstreckt und einige web.config Änderungen.

Ich weiß, das ist eine alte Post - aber alles lebt für immer im Internet

Wie auch immer, ich hatte eine alte Webseite von IIS6 IIS8 zu bewegen. Dies ist eine WebForms Website, aber ich nehme an, das sehr einfache Lösung ist das gleiche.

erhielt ich den Fehler: Kann nicht Gussobjekt des Typs ‚System.Security.Principal.WindowsIdentity‘ eingeben ‚System.Web.Security.FormsIdentity‘

.

Alles, was ich tat, war, einen neuen Anwendungspool für die Website erstellen. Wenn diese zu schaffen, habe ich den Managed Pipeline-Modus ‚Classic‘. (Lesen Sie mehr hier - http://www.hanselman.com/blog/MovingOldAppsFromIIS6ToIIS8AndWhyClassicModeExists.aspx) vergessen Sie nicht, den Anwendungspool der Website auf den neuen Pool, den Sie gerade erstellt setzen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top