GetResource(int resourceId) アクションを持つ .net Web API があるとします。このアクション (指定された ID を持つ) は、その ID に関連付けられたユーザーに対してのみ許可される必要があります (リソースは、たとえば、ユーザーによって書かれたブログ投稿である可能性があります)。
これは多くの方法で解決できますが、例を以下に示します。
public Resource GetResource(int id)
{
string name = Thread.CurrentPrincipal.Identity.Name;
var user = userRepository.SingleOrDefault(x => x.UserName == name);
var resource = resourceRepository.Find(id);
if (resource.UserId != user.UserId)
{
throw new HttpResponseException(HttpStatusCode.Unauthorized);
}
return resource;
}
ユーザーが何らかのメカニズムによって認証されている場合。
ここで、たとえば管理者タイプのユーザーにも、(同じ ID で) エンドポイントを使用する権限を与えたいとしましょう。このユーザーは、リソースとの直接的な関係はありませんが、そのタイプ (またはロール) のために承認を持っています。これは、ユーザーが管理者タイプであるかどうかを確認し、リソースを返すだけで解決できます。
すべてのアクションで認証コードを記述する必要がないように、これを一元化する方法はありますか?
編集 回答に基づいて、質問を明確にする必要があると思います。
私が本当に求めているのは、リソースベースの承認を可能にするメカニズムですが、同時に一部のユーザーが同じエンドポイントと同じリソースを消費できるようにするメカニズムです。以下のアクションは、この特定のエンドポイントとこの特定の役割 (管理者) についてこれを解決します。
public Resource GetResource(int id)
{
string name = Thread.CurrentPrincipal.Identity.Name;
var user = userRepository.SingleOrDefault(x => x.UserName == name);
var resource = resourceRepository.Find(id);
if (!user.Roles.Any(x => x.RoleName == "Admin" || resource.UserId != user.UserId)
{
throw new HttpResponseException(HttpStatusCode.Unauthorized);
}
return resource;
}
私が求めているのは、この問題を解決する一般的な方法であり、同じ目的で 2 つの異なるエンドポイントを作成したり、すべてのエンドポイントでリソース固有のコードを作成したりする必要がありません。