ファイルストレージシステムの例を書いています(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
のは適切なツールではないかもしれませんが、うまくいけば、これは問題を示しています。
現在ログインしているユーザーが特定のアクション、より具体的には特定のリソースにアクセスできるようにするには、コントローラーをどのように接続すればよいですか?