2017-10-15 4 views
0

私は、モバイルアプリ(アンドロイド)のバックエンドWebサービス(asp.netコア2.0)を作成しています。アプリのユーザーは自分のアイテムだけを表示する必要があり、ウェブサービスでチェックしたいと思います。ウェブサービスは、ユーザーがアイテムを見ることを許可されているかどうかをどのようにチェックしますか?

public class IsAllowedToSeeAuthorizationHandler : AuthorizationHandler<IsAllowedToSeeRequirement, Item> 
{ 
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, IsAllowedToSeeRequirement requirement, Item item) 
    { 
     if (context.User.Identity.Name == item.Owner) 
     { 
      context.Succeed(requirement); 
     } 
     return Task.CompletedTask; 
    } 
} 

これまでのところ、とても良い、この:私のコントローラで

、私はどこかにこの

[HttpGet("{id}")] 
    public async Task<IActionResult> Get(int id) 
    { 
     var item = _repository.GetItem(id); 
     if (!(await _authorizationService.AuthorizeAsync(User, item, nameof(IsAllowedToSeeRequirement))).Succeeded) 
      return BadRequest(); 
     return new ObjectResult(item); 
    } 

などのコードは、IsAllowedToSeeRequirementと実際のチェックを行いAuthorizationHandler実装があります持っています動作しますが、それは多くのコードと間接的なものであり、魔法の文字列については言及しません(ただし、nameofによって緩和されます)。

私は

[HttpGet("{id}")] 
    public IActionResult Get(int id) 
    { 
     var item = _repository.GetItem(id); 
     if (item.Owner != User.Identity.Name) 
      return BadRequest(); 
     return new ObjectResult(item); 
    } 

を書いて、要求クラス、ハンドラ、ハンドラの登録と要件のをスキップすることができます。

私はこの種の物について読んだすべてのチュートリアルで、常にこのハンドラのことがあります。だから私は面倒な方法のための正当な理由があると思うが、誰が実際に何があるかも説明できますか?

答えて

1

あなたの質問は非常に広範ですが、私は、代替と一般的に使用されるアプローチについて説明してみましょう:自分自身を認証するためにacquire a tokenへの1つは持っているウェブAPI自体にアクセスするには

を。そのトークンでは、ユーザーID /名前はas a claimに格納されます。リポジトリを使用してデータストアにアクセスするときには、そこに認可テーブルを作成し、トークンのユーザー資格情報を使用してそのテーブルを結合することができます。

完全な例については、this blogpostを参照してください。

さらに詳しい背景資料at the docs

関連する問題