1

アカウントのログインにドメイン制約を追加するためにカスタムOAuthAuthorizationServerProviderを実装しました。すべてが良かった。しかし、ユーザーがトークンを取得すると、必要なシステムにそのトークンを使用できるという問題がありました。例:マルチテナントASP.NET IDのトークンの再検証方法?

TokenEndpointPathは適切なユーザー名とパスワード(テナント1の管理者アカウントと仮定します):http://localhost:40721/api/v1/account/authを要求し、ベアラトークンを受け取ります。

これは、テナント0のhttp://localhost:40720/api/v1/info/adminにアクセスするために使用されます。リクエストは承認済みと見なされます。

私はCreateProperties方法を変更しようとしたが、それは助けていませんでした:

public static AuthenticationProperties CreateProperties(string userName) 
    { 
     var tenant = DependencyUtils.Resolve<IdentityTenant>(); 
     IDictionary<string, string> data = new Dictionary<string, string> 
     { 
      { "userName", userName }, 
      { "tenantId", tenant.Tenant.Id.ToString() }, 
     }; 
     return new AuthenticationProperties(data); 
    } 

私もValidateAuthorizeRequestを上書きしようとしたが、それは私のデバッグに呼び出されることはありません。

どこでも小切手を実装する必要があるので、トークンはドメイン/正しいテナントにのみ有効ですか?

(注:テナントには複数のドメインがある可能性があるので、ドメインにこだわるのではなく、正しいテナントに対してアカウントのチェックを手動で行うことは可能ですが、できればプラスです

答えて

0

私の質問に直接答えはありません(ASP.NET Identityワークフローの中にないので)。しかし、私が適用した最も簡単な修正は、代わりにActionFilterAttributeを使用することでした。

public class DomainValidationFilter : ActionFilterAttribute 
{ 

    public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken) 
    { 
     // Other Code... 

     // Validate if the logged in user is from correct tenant 
     var principal = actionContext.ControllerContext.RequestContext.Principal; 
     if (principal != null && principal.Identity != null && principal.Identity.IsAuthenticated) 
     { 
      var userId = int.Parse(principal.Identity.GetUserId()); 
      // Validate against the tenant Id of your own storage, and use this code to invalidate the request if it is trying to exploit: 
      actionContext.Response = actionContext.Request.CreateResponse(System.Net.HttpStatusCode.Unauthorized, "Invalid Token"); 

     } 

     return base.OnActionExecutingAsync(actionContext, cancellationToken); 
    } 

} 

その後FilterConfigまたはWebApiConfigのいずれかでそれを登録することで、すべてのアクションにフィルターを適用します。

config.Filters.Add(new DomainValidationFilter()); 
関連する問題