0

Wir haben ein Web-API-Projekt erstellt, in dem wir die Standardauthentifizierung vorläufig verwendet haben. Wir haben das nuget-Paket verwendet, um die Web-API-Hilfedokumentation zu erstellen, sodass neue Bereiche, Controller und Ansichten für die Web-API-Hilfe hinzugefügt wurden. Wir haben die Web-API auf IIS gehostet. Jetzt kann jeder die Web-API-Hilfe durchsuchen, indem er einfach die Web-API-URL "" durchsucht. Wir möchten die Hilfeseiten (die in MVC implementiert sind) authentifizieren. Die Frage hier ist meine Web-API verwendet grundlegende Authentifizierung und ich möchte einen Mechanismus erstellen, so dass Web-API-Hilfe vor jeder Anfrage für Web-API-Hilfeseite authentifiziert werden.Versetzen Sie die Web-API-Dokumentation hinter eine Anmeldeseite, sodass nur ein gültiger Benutzer die Web Api-Hilfedokumentation durchsuchen kann.

Um dies zu erreichen, habe ich eine "AccountController", "Login" -Seite erstellt. Ich habe auch einen Authentifizierungsfilter erstellt und den "HelpController" eingerichtet (der alle Aktionen zum Rendern von Hilfeseiten enthält). Login-Seite Code:

public ActionResult Login(LoginViewModel model) 
{ 
    bool isValidated = //Code for validating the users 
    if (ModelState.IsValid && isValidated) 
    { 
     var identity = new HelpAuthenticationIdentity(model.UserName, model.Password); 
     var principal = new WindowsPrincipal(identity); 
     ControllerContext.HttpContext.User = principal; 

     return RedirectToAction("Index", "Help", new { area = "HelpPage" }); 
    } 
    else 
     return View(); 
} 

Ich habe eine Klasse für Identität geschaffen, die Windows Klasse

public class HelpAuthenticationIdentity : WindowsIdentity 
{ 
    public HelpAuthenticationIdentity(string userName, string password) 
     : base(userName, "Basic") 
    { 
    this.Password = password;   
    } 
    public string Password { get; set; } 
} 

erbt Wenn ich auf Login klicken, nachdem die gültigen Anmeldeinformationen eingeben, wird es zu Index Aktion umgeleitet werden von Hilfe Controller. Da ich den Authentifizierungsfilter habe, wird er zuerst die "OnAuthentication" -Methode aufrufen. Hier erhält es immer das Flag "context.HttpContext.User.Identity.IsAuthenticated" als false. Das Authentifizierungsfilterattribut lautet wie folgt:

/// <summary> 
/// Authentication filter to authenticate the request for Web Api Help 
/// </summary> 
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)] 
public class HelpAuthenticationAttribute : ActionFilterAttribute, IAuthenticationFilter 
{ 
    public void OnAuthentication(AuthenticationContext context) 
    { 
     if (!context.HttpContext.User.Identity.IsAuthenticated) 
     { 
      context.Result = new HttpUnauthorizedResult(); 
     } 
    } 

    public void OnAuthenticationChallenge(AuthenticationChallengeContext context) 
    { 
     if(context.Result == null || context.Result is HttpUnauthorizedResult) 
     { 
      context.Result = new RedirectToRouteResult("Login", 
       new System.Web.Routing.RouteValueDictionary{ 
        {"controller", "Account"}, 
        {"action", "Login"} 
       }); 
     } 
    } 
} 

Geben Sie bitte Ihre Eingaben an.

Antwort

0

Das Problem ist behoben. Ich habe meine Login-Aktion geändert:

[HttpPost] 
public ActionResult Login(LoginViewModel model) 
{ 
    bool isValidated = //Code for validating the users 
    if (ModelState.IsValid && isValidated) 
    { 
     //Set the authentication cookie for the logged in user. 
     FormsAuthentication.SetAuthCookie(model.UserName, true); 
     return RedirectToAction("Index", "Help", new { area = "HelpPage" }); 
    } 
    else 
    { 
     return View(); 
    }     
} 

ich umgesetzt haben „Application_AuthenticateRequest“ -Methode in Global.asax.cs

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
{ 
    try 
    { 
     if (Context.Request.Cookies[".ASPXAUTH"] != null) 
     { 
      var authCookie = FormsAuthentication.Decrypt(Context.Request.Cookies[".ASPXAUTH"].Value); 
      var identity = new GenericIdentity(authCookie.Name); 
      Context.User = new GenericPrincipal(identity, null); 
     } 
     else 
     { 
      Context.User = null; 
     } 
    } 
    catch(Exception ex) 
    { 
     Context.User = null; 
    } 
} 

Nach gültigen Anmeldeinformationen eingegeben hat, wird der Benutzer ein Es authentifiziert wird umgeleitet werden helfen Seite.