2017-05-15 10 views
0

個人アカウントを使用してトークンを正しく発行するWeb APIがあります。ネイティブアプリケーションからソーシャル認証を受け入れるように変更しました。Windows認証とウェブAPIの個々のアカウントを混ぜて

ここで、内部の従業員が新しいユーザー名とパスワードを作成するのではなく、ドメインの資格情報を使用してそのAPIにアクセスするためのオプションを追加したいとします。

従業員はトークンを取得するためにapi/tokenを呼び出す必要がありますが、ドメイン資格情報であるbodyを渡します。

通常のユーザー名とパスワードとドメインの資格情報を区別する方法と、変更を正確に行う場所は何ですか?

答えて

0

私は成功しましたが、私は自分がセキュリティ上の問題に陥っていないことを確認したいと思います。

まず、私が変更され何がすべてのプロバイダファイル内にある:ApplicationOAuthProvider.cs:

  1. クライアントは、ドメインを使用してログインしたいかどうかを定義するために新しいプライベート変数を作成します:修正

    private bool DomainUser = false; 
    
  2. トークンを発行する最初のタスクであるため、要求本体内の新しいパラメータ(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); 
    } 
    
  3. は、ユーザー名とパスワードを確認し、タスクを変更するので、まずこれが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; 
    } 
関連する問題