prosumer caracteristicas .net authentication asp.net-web-api authorization claims-based-identity

.net - caracteristicas - prosumer



Autorización de reclamos para recursos específicos (2)

Estoy escribiendo un sistema de almacenamiento de archivos de ejemplo (ejemplo solo para stackoverflow).

Mis modelos de dominio actuales se ven así:

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; } }

El código que estoy escribiendo para crear el 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" }); }

En mi sistema, un usuario puede agregar archivos, también puede recuperarlos, eliminarlos y actualizarlos; sin embargo, la advertencia es que un usuario solo puede recuperar y modificar sus propios archivos (donde File.UserID debe coincidir con la identidad de los File.UserID registrados). en usuario).

Mi controlador de archivos se ve de la siguiente manera.

[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; } }

Tal vez usar Claim s no es la herramienta adecuada para el trabajo, pero con suerte esto ilustra el problema.

¿Cómo debo conectar mis controladores para asegurarme de que el usuario actualmente conectado tenga acceso para realizar acciones específicas y más específicamente, ciertos recursos?


No estoy seguro si los reclamos son el enfoque correcto para lo que está haciendo. Lo que realmente quieres representar son permisos. Un reclamo típicamente representa un atributo de identidad, como el nombre de usuario, el correo electrónico o los roles a los que pertenece, pero no los permisos. Puede representar permisos con reclamos, pero puede necesitar toneladas dependiendo de cuán grande sea su aplicación. Un enfoque típico es asignar un rol a un conjunto de permisos (en su caso, agregar archivos sería un permiso). También puede crear un filtro de autorización personalizado derivado de AuthorizeAttribute para verificar si el principal actual tiene los permisos adecuados para ejecutar la acción. Ese filtro puede recibir los permisos necesarios para ejecutar la acción como argumentos.