2017-05-15 1 views
0

Ich habe eine Web-API, die einzelne Konten verwenden und Token ordnungsgemäß ausgeben. Ich habe es so modifiziert, dass es die soziale Authentifizierung von der nativen Anwendung akzeptiert.Mix Windows-Authentifizierung und individuelle Konten in Web-API

Jetzt möchte ich Optionen für interne Mitarbeiter für den Zugriff auf diese API mit ihren Anmeldeinformationen hinzufügen, anstatt einen neuen Benutzernamen und ein neues Passwort zu erstellen.

Mitarbeiter sollten die API/Token aufrufen, um ein Token zu erhalten, jedoch werden sie in den Körper, die Domain-Anmeldeinformationen übergeben.

Haben Sie Ideen, wie Sie zwischen normalem Benutzernamen und Kennwort und Domänenanmeldeinformationen unterscheiden können und wo genau die Änderungen vorgenommen werden?

Antwort

0

Es ist mir gelungen, aber ich möchte nur sicherstellen, dass ich mich nicht in Sicherheitsprobleme begeben habe, und ich bin bereit für jeden Kommentar.

Zuerst werden alle, was ich verändert hat, ist in der Provider-Datei: ApplicationOAuthProvider.cs:

  1. schaffen neue private Variable zu definieren, ob Kunde will Domain anmelden mit:

    private bool DomainUser = false; 
    
  2. Modified die erste Aufgabe, die für die Ausgabe des Tokens zuständig ist, so dass es innerhalb des Anfragekörpers nach einem neuen Parameter (DomainUser) sucht: grant_type=password&username=username&password=password&DomainUser=true:

    public override Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context) 
    { 
        // Resource owner password credentials does not provide a client ID. 
        if (context.ClientId == null) 
        { 
         DomainUser = context.Parameters["DomainUser"] == "true"; 
         context.Validated(); 
        } 
    
        return Task.FromResult<object>(null); 
    } 
    
  3. modifiziert, um die Aufgabe, die den Benutzernamen und das Passwort verifizieren, so wird es zunächst prüfen, ob dies eine Anforderung für einen Domain ist, und mit der Domäne authentifizieren, sonst wird es wie gewohnt weiter:

    public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
        var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 
        ApplicationUser user; 
        if (DomainUser && IsValidCredentials(context.UserName, context.Password, "MyDomain")) 
         user=await PrepareDomainUser(context); 
        else 
         user = await userManager.FindAsync(context.UserName, context.Password); 
    

, wo die Funktion IsValidCredentials werden die Anmeldeinformationen mit der Domäne überprüfen (Sie müssen Verweis auf System.DirectoryServices.AccountManagement hinzugefügt werden):

private static bool IsValidCredentials(string Username, string Password, string Domain) 
    { 
     using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain)) 
     { 
      return pc.ValidateCredentials(Username, Password); 
     } 
    } 

und t Der PrepareDomainUser erstellt, wenn dies das erste Mal ist, den Benutzer der Anwendung ohne Passwort:

private async Task<ApplicationUser> PrepareDomainUser(OAuthGrantResourceOwnerCredentialsContext context) 
    { 
     var userManager = context.OwinContext.GetUserManager<ApplicationUserManager>(); 
     ApplicationUser user = await userManager.FindByEmailAsync(context.UserName); 
     if (user == null) 
     { 
      user = new ApplicationUser() { UserName = context.UserName, Email = context.UserName }; 
      IdentityResult result = await userManager.CreateAsync(user); 
     } 
     return user; 
    }