6

Wie erzwinge ich einen Benutzer erneut zu authentifizieren, bevor Sie eine Aktion in MVC ausführen?Re-authentifizieren Sie Benutzer in MVC-Anwendung für Aktion

Wir verwenden die Windows-Authentifizierung. Es gibt einige Aktionen, die wir sicherstellen möchten, dass sie vom Benutzer ausgeführt werden (und verhindern, dass andere Benutzer diese Aktionen ausführen, wenn der Benutzer vergessen hat, seine Arbeitsstation zu sperren).

Im Idealfall würde ich nur in der Lage sein, ein Attribut zu schreiben, die sich Authorize:

namespace AuthTest.Controllers 
{ 
    [Authorize(Roles="MyApp")] 
    public class HomeController : Controller 
    {  
     public ActionResult Index() 
     { 
      // A regular action 
      return View(); 
     } 

     [ReAuthenticate] 
     public ActionResult CriticalAction() 
     { 
      // Do something important 
      return View(); 
     } 
    } 
} 

Es scheint, dass ich den Benutzer zwingen kann, um ihre Anmeldeinformationen erneut eingeben, indem Sie die benutzerdefinierten mit ReAuthenticate Ausgabe Attribute eine HTTP 401 Antwort in der AuthorizeCore Methode. Dies erforderte jedoch einige Tricks seit Html.ActionLink wurde zwei Anforderungen zu senden:

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    bool ok = base.AuthorizeCore(httpContext); 
    if (!ok) return false; 

    if (httpContext.Session["ReAuthCnt"] == null) 
    { 
     httpContext.Session["ReAuthCnt"] = 1; 
     return false; 
    } 
    else if ((int) httpContext.Session["ReAuthCnt"] < 2) 
    { 
     httpContext.Session["ReAuthCnt"] = (int)httpContext.Session["ReAuthCnt"] + 1; 
     return false; 
    } 
    else 
    { 
     httpContext.Session["ReAuthCnt"] = 0; 
     return true; 
    } 
} 

Gibt es einen besseren Weg, um die Wiederzulassung zu erreichen?

+0

Was meinen Sie durch erneute Authentifizierung? –

+0

Warum möchten Sie? Wenn der Benutzer authentifiziert wird, werden sie, nun, authentifiziert. Sie können OAuth berücksichtigen, wenn Sie keine Authentifizierung aufrechterhalten können. Vielleicht könnten Sie, wenn Sie Ihr Problem etwas genauer beschreiben, vorschlagen, was zu tun ist. – griegs

+0

Ich habe die Frage mit weiteren Details über das Szenario aktualisiert und was ich versucht habe. – user2813199

Antwort

0

Wenn der Benutzer einen POST ausführt, können Sie diesem Formular einen Benutzernamen und ein Kennwortfeld hinzufügen und dann die Anmeldeinformationen für Active Directory entweder im Controller oder mithilfe eines ActionFilter überprüfen?

-2

Sie können Idee von hier i Rolle Basis Authorization hier tun

[Authorize(Roles = "admin,superadmin")]//Controler Authorization 
     public class ControlController : Controller 
     { 

      [Authorize(Roles = "superadmin")]//action Authorization 
      public ActionResult youraction() 
      { 
       return View(); 
      } 
     } 
0

Wenn Sie durch das Geschäft erlaubt sind eigentlich eine Form zu verwenden, um sie erneut zu authentifizieren (mit anderen Worten eine Seite, die sie geben Sie einen Benutzername und Passwort in) dann können Sie Folgendes tun.

ReauthorizeAttribute

// custom page where user does type user/pass 
private string revalidateLoginUrl = "/account/reauth"; 
private bool? hasReauthenticated = false; 

protected override bool AuthorizeCore(HttpContextBase httpContext) 
{ 
    var authUrl = HttpContext.Request.Url; 
    hasReauthenticated = httpContext.Session[authUrl] as bool? 

    // could be just (hasReauthenticated) 
    // this look a bit more readable 
    return (hasReauthenticated == true); 
} 

public override void OnAuthorization(AuthorizationContext filterContext) 
{ 
    if (filterContext == null) 
    { 
    throw new ArgumentNullException("filterContext"); 
    } 

    var isAuthorized = AuthorizeCore(filterContext.HttpContext); 

    var authUrl = filterContext.HttpContext.Request.Url; 
    filterContext.HttpContext.Session[authUrl] = false; 

    if (!isAuthorized) 
    { 
    HandleUnauthorizedRequest(filterContext); 
    } 
} 

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    // something like this 
    var fullUrl = validateLoginurl + "?returnUrl=" 
    + HttpUtility.UrlEncode(revalidaetLoginUrl); 

    filterContext.HttpContext.Response.Redirect(validateLoginUrl); 
} 

ReauthModel

public class ReauthModel 
{ 
    public string Username { get; set; } 
    public string Password { get; set; } 
    public string ReturnUrl { get; set; } 
} 

AccoountController.cs (Validate a username and password against Active Directory?)

using System.DirectoryServices.AccountManagement; 

public ActionResult Reauth(string returnUrl) 
{ 
    var model = new ReauthModel(); 
    model.ReturnUrl = returnUrl; 

    return View(model); 
} 

[ValidateAntiForgeryToken] 
public ActionResult Reauth(ReauthModel model) 
{ 
    using(PrincipalContext pc = new 
    PrincipalContext(ContextType.Domain, "YOURDOMAIN")) 
    { 
    // validate the credentials 
    bool isValid = pc.ValidateCredentials("myuser", "mypassword"); 
    if (isValid) 
    { 
     Session[model.ReturnUrl] = true; 
     return RedirectTolocal(model.ReturnUrl); 
    } 
    } 

    // not authenticated 
    return RedirectToAction("?"); 

    //or 
    model.Username = string.Empty; 
    model.Passsword = string.Empty; 

    return View(model); 
} 

Ich glaube, Sie basiert auf dem ReauthModel vorstellen kann, was die Ansicht aussehen würde.

Hinweis: sollte zusätzlich zu andere AuthorizeAttribute die verwendet werden, den Sie verwenden, nicht statt. Da der Benutzer den Benutzernamen und das Passwort auf einer Website eingibt, benötigt dieser , um SSL zu verwenden (auch wenn es intern ist).

0

Ich würde dies auf eine andere Weise nähern. Es klingt wie das, was Sie wirklich wollen, ist eine temporäre Erhöhung der Anmeldeinformationen, ähnlich wie UAC oder Sudo, aber auf Ihrer Website. Sie möchten wahrscheinlich, dass der Benutzer nach Ablauf einer bestimmten Zeit erneut seine Anmeldeinformationen eingeben muss, um auf diese Funktionen zugreifen zu können.

Der Ansatz, den ich nehmen würde, ist ein benutzerdefiniertes IPrincipal zu erstellen, mit dem Sie dem Benutzer vorübergehend eine bestimmte Rolle hinzufügen und diese Rolle nach einer gewissen Zeit ablaufen lassen können. Dies wäre nicht an die Rollen gebunden, die der Benutzer in der Datenbank gespeichert hat, außer vielleicht, dass nur Benutzer mit einer bestimmten Rolle erhöht werden können.

Auf diese Weise können Sie einfach eine Passwortprüfung durchführen, um die Rolle vorübergehend an die Benutzer Rollenliste hinzufügen und dann die Standard-Berechtigungsattribut wird sie einlassen.