2016-05-27 15 views
4

Ich versuche, einen Abschnitt einer MVC 5-Webseite auf Benutzer einer bestimmten Active Directory-Gruppe beschränkt, aber das Attribut [Autorisieren] (auf Controller) blockiert auch angemeldete Benutzer.Mvc, Autorisiert Bounces autorisierte Benutzer

Mein Login-Seite Code sieht hinter wie folgt:

public class AccountController: Controller 
{ 

    [AllowAnonymous] 
    public ActionResult Login(string returnUrl) 
    { 
     ViewBag.ReturnUrl = returnUrl; 
     return View(); 
    } 

    // POST: /Account/Login 
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Login(LoginModel model, string returnUrl) 
    { 
     if (ModelState.IsValid) 
     { 
      ActiveDirectoryHelper ad = new ActiveDirectoryHelper(); 

      if (Membership.ValidateUser(model.UserName, model.Password)) 
      { 
       if (ad.CheckGroupMembership(model.UserName)) 
       { 
        FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe); 

        if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/") 
         && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\")) 
        { 
         return Redirect(returnUrl); 
        } 
        else 
        { 
         return RedirectToAction("Index", "Home"); 
        } 
       } 
       else 
       { 
        ModelState.AddModelError("", "Credentials are correct but you are no authorised \n You Need membership in group: HKF-HIT-FortigateAPI-GS"); 
       } 
      } 
      else 
      { 
       ModelState.AddModelError("", "The user name or password provided is incorrect"); 
      } 
     } 
     // if we got this far, something failed, redisplay form 
     return View(model); 
    } 
    // POST: /Account/LogOff 
    [HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult LogOff() 
    { 
     FormsAuthentication.SignOut(); 
     return RedirectToAction("Index", "Home"); 
    } 
} 
public class ActiveDirectoryHelper 
{ 
    string group = "HKF-HIT-FortigateAPI-GS"; 
    public bool CheckGroupMembership(string name) 
    { 
     var context = new PrincipalContext(
          ContextType.Domain, 
          "AD-Domain", @"Username", "Password"); 

     var userPrincipal = UserPrincipal.FindByIdentity(
          context, 
          IdentityType.SamAccountName, 
          name); 

     var test = userPrincipal; 

     if (userPrincipal.IsMemberOf(context, 
      IdentityType.Name, 
      group)) 
     { 
      return true; 
     } 
     return false; 
    } 
} 

Der Benutzer gelangt und zum Index in Heimsteuerung umgeleitet.

Dieser Controller hat jedoch den [Genehmigtes] Wert wie folgt festgelegt:

[Authorize] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

Und hier der Benutzer in die Loginpage prallte zurück, als ob er nicht berechtigt war.

Auch diese web.config:

im Browser i die ADAuthCookie sehen kann.

Edit: Ading Bilder von Request data:

Konto Beitrag:

enter image description here

Fiedler:

enter image description here

Index Get:

enter image description here

Fiedler:

enter image description here

EDIT: Frage wird gelöst, nachdem die erstaunliche Führung durch i realisiert in den Kommentaren verknüpft gehen Trog meine Cooke in der Global.asaz.cs Klasse Handling war ich nie .

Das Hinzufügen eines Overides zu Application_PostAuthenticateRequest hat mein Problem gelöst.

Der Code Ich habe am Ende mit:

protected void Application_PostAuthenticateRequest(Object sender, EventArgs e) 
{ 
    HttpCookie authCookie = Request.Cookies[FormsAuthentication.FormsCookieName]; 

    if (authCookie != null) 
    { 
     FormsAuthenticationTicket authTicket = FormsAuthentication.Decrypt(authCookie.Value); 

     JavaScriptSerializer serializer = new JavaScriptSerializer(); 

     CustomPrincipalSerializeModel serializeModel = serializer.Deserialize<CustomPrincipalSerializeModel>(authTicket.UserData); 

     CustomPrincipal newUser = new CustomPrincipal(authTicket.Name); 
     newUser.Name = serializeModel.Name; 
     HttpContext.Current.User = newUser; 
    } 
} 

In global.asax und ich auch hinzugefügt:

CustomPrincipalSerializeModel serializeModel = new CustomPrincipalSerializeModel(); 
serializeModel.Name = model.UserName; 

JavaScriptSerializer serializer = new JavaScriptSerializer(); 

string userData = serializer.Serialize(serializeModel); 

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(
     1, 
     model.UserName, 
     DateTime.Now, 
     DateTime.Now.AddMinutes(15), 
     false, 
     userData); 

string encTicket = FormsAuthentication.Encrypt(authTicket); 
HttpCookie faCookie = new HttpCookie(FormsAuthentication.FormsCookieName, encTicket); 
Response.Cookies.Add(faCookie); 

Zu meiner Login-Seite.

+0

Haben Sie die http-Sitzung mit einem http-Debugger wie Fiddler debugged? Sind Sie sicher, dass der Cookie da ist und zusammen mit der Anfrage an den Home/Index übergeben wird? –

+0

Ich habe Fiddler und Visual Studio-Ausgabe von/account/login post und folgenden/Home/index hinzugefügt. – Tobias

Antwort

3

AuthorizeAttributechecks the HttpContext.User value (an IPrincipal implementation) and the HttpContext.User.Identity value (an IIdentity implementation).

Alle Sicherheitsframeworks (Identity, Membership usw.) von Microsoft verwenden diese Schnittstellen für die Kommunikation mit MVC/ASP.NET. Wenn Sie ein benutzerdefiniertes Sicherheitsframework verwenden, müssen Sie auch diese Schnittstellen implementieren und sie im Ereignis AcquireRequestState (bei Verwendung des Sitzungsstatus) oder PostAuthorizeRequest festlegen.

Siehe ASP.NET MVC - Set custom IIdentity or IPrincipal für ein Beispiel der letzteren zusammen mit benutzerdefinierten IPrincipal und IIdentity Implementierungen.

Verwandte Themen