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:
schaffen neue private Variable zu definieren, ob Kunde will Domain anmelden mit:
private bool DomainUser = false;
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);
}
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;
}