7

ファイルストレージシステムの例を書いています(stackoverflowの例)。

私の現在のドメイン モデルは次のようになります。

public class User
{
    public int ID { get; set; }
    public string LoginIdentifier { get; set; }
    public string Password { get; set; }
}

public class File
{
    public int ID { get; set; }
    public int UserID { get; set; }
    public string FileName { get; set; }
    public byte[] Data { get; set; }
}

IPrincipal を作成するために書いているコード:

private static IPrincipal CreatePrincipal(User user)
{
    Debug.Assert(user != null);

    var identity = new GenericIdentity(user.LoginIdentifier, "Basic");

    // TODO: add claims
            identity.AddClaim(new Claim("Files", "Add"));

    return new GenericPrincipal(identity, new[] { "User" });
}

私のシステムでは、ユーザーはファイルを追加したり、それらを取得、削除、更新したりできますが、ユーザーは自分のファイルのみを取得および変更できることに注意してFile.UserIDください (ログインしているユーザーの ID と一致する必要があります)。 .

My Files コントローラーは次のようになります。

[Authorize]
public class FilesController : ApiController
{
    private readonly FileRepository _fileRepository = new FileRepository();

    public void Post(File file)
    {
        // not sure what to do here (...pseudo code...)
        if (!CheckClaim("Files", "Add"))
        {
            throw new HttpError(HttpStatusCode.Forbidden);
        }

        // ... add the file
        file.UserID = CurrentPrincipal.UserID; // more pseudo code...

        _fileRepository.Add(file);
    }

    public File Get(int id)
    {
        var file = _fileRepository.Get(id);

        // not sure what to do here (...pseudo code...)
        if (!CheckClaim("UserID", file.UserID))
        {
            throw new HttpError(HttpStatusCode.Forbidden);
        }

        return file;
    }
}

sを使用するClaimのは適切なツールではないかもしれませんが、うまくいけば、これは問題を示しています。

現在ログインしているユーザーが特定のアクション、より具体的には特定のリソースにアクセスできるようにするには、コントローラーをどのように接続すればよいですか?

4

2 に答える 2

5

クレームがあなたがしていることに対する正しいアプローチであるかどうかはわかりません. 本当に表現したいのは権限です。クレームは通常、ユーザー名、電子メール、ロールなどの ID 属性を表しますが、アクセス許可は表しません。権限をクレームで表すこともできますが、アプリケーションの大きさによっては、大量の権限が必要になる場合があります。典型的なアプローチは、ロールを一連のアクセス許可にマップすることです (あなたの場合、ファイルの追加はアクセス許可になります)。AuthorizeAttribute から派生するカスタム承認フィルターを作成して、現在のプリンシパルがアクションを実行するための適切なアクセス許可を持っているかどうかを確認することもできます。そのフィルターは、アクションを実行するために必要なアクセス許可を引数として受け取る場合があります。

于 2013-05-02T01:59:08.633 に答える
5

パブロは正しい - 主張はアイデンティティを説明する. ただし、その ID を使用して承認の決定を下します。ClaimsAuthorizationManager と呼ばれる別の抽象化があります。

ここを見てください: http://leastprivilege.com/2012/10/26/using-claims-based-authorization-in-mvc-and-web-api/

于 2013-05-02T03:26:16.810 に答える