私は成功しましたが、私は自分がセキュリティ上の問題に陥っていないことを確認したいと思います。
まず、私が変更され何がすべてのプロバイダファイル内にある:ApplicationOAuthProvider.cs:
クライアントは、ドメインを使用してログインしたいかどうかを定義するために新しいプライベート変数を作成します:修正
private bool DomainUser = false;
トークンを発行する最初のタスクであるため、要求本体内の新しいパラメータ(DomainUser)を確認します。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);
}
は、ユーザー名とパスワードを確認し、タスクを変更するので、まずこれがDomainUserの要求であるかどうかを確認し、ドメインで認証、そうでない場合、それは通常通り継続するだろう:
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);
関数IsValidCredentialsは、ドメインと資格情報を確認します
(あなたがSystem.DirectoryServices.AccountManagement
への参照を追加する必要があります):
private static bool IsValidCredentials(string Username, string Password, string Domain)
{
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, Domain))
{
return pc.ValidateCredentials(Username, Password);
}
}
とt彼はPrepareDomainUserがこれが初めてであれば、パスワードなしのアプリケーションユーザーを作成します:
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;
}