声明特定资源的授权

2023-11-21

我正在编写一个示例文件存储系统(仅用于 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应与登录用户的身份匹配)。

我的文件控制器如下所示。

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

也许使用Claims 不是完成这项工作的正确工具,但希望这能说明问题。

我应该如何连接我的控制器以确保当前登录的用户有权执行特定操作,更具体地说,某些资源?


我不确定索赔是否适合您正在做的事情。你真正想要代表的是权限。声明通常代表身份属性,例如用户名、电子邮件或其所属的角色,但不代表权限。您可以使用声明来表示权限,但您可能需要大量声明,具体取决于您的应用程序有多大。典型的方法是将角色映射到一组权限(在您的情况下,添加文件将是一种权限)。您还可以创建派生自 AuthorizeAttribute 的自定义授权过滤器,以检查当前主体是否具有执行操作的正确权限。该过滤器可能会接收执行操作所需的权限作为参数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

声明特定资源的授权 的相关文章

随机推荐

  • 使用 AngularJs 中的 Expression 动态生成 ng-class 变量

    这是我的 HTML 代码的片段 div div boxName div div 我正在尝试做的事情 我使用上面编写的代码片段创建了 3 个 div 元素 它们将位于屏幕顶部 每个 div 元素将使用 css 赋予一个盒子的形状 框 div
  • 将 string 转换为 int 太慢

    我有一个程序 每行读取 3 个字符串 共 50000 个 然后它会执行其他操作 读取文件并转换为整数的部分占用了总运行时间的 80 我的代码片段如下 import time file open E temp edges big txt re
  • 升级pip后DistributionNotFound错误

    在阅读有关 virtualenv 的内容时here我意识到我没有 pip 1 3 所以我跑了pip install upgrade pip现在当我跑步时pip version我得到以下信息 Traceback most recent cal
  • 重复异步任务

    我对在 Android 应用程序中重复 AsyncTask 的可能性有疑问 我想重复一些操作 例如从服务器下载文件 如果由于某种原因无法下载该文件 则重复n次 有一种快速的方法可以做到这一点吗 您不能重复执行 AsyncTaskbut您可以
  • navigator.onLine 在我的手机上无法使用。如何检查互联网是否在线。离线???电话间隙

    我正在为我的应用程序使用phonegap 我的应用程序基本上用于来自一个网站的 RSS 提要 但我的要求是当没有互联网时应用程序应该alert offline 当应用程序在线运行时 所有数据都存储到数据库中 当互联网不存在时 数据会从数据库
  • 此处不允许使用 Maven Jetty 插件守护进程元素

    我正在尝试配置项目的 pom xml 文件 我希望它在测试阶段启动 Jetty 服务器 为了做到这一点 我应该将 daemon 元素添加到 Jetty 插件中 如下所示 但 IntelliJ 警告我 此处不允许使用 Element daem
  • Python Marshmallow Field 可以是两种不同的类型

    我想指定一个棉花糖模式 对于我的一个字段 我希望对其进行验证 但它可以是字符串或字符串列表 我尝试过原始字段类型 但这允许一切通过 有没有办法只验证我想要的两种类型 就像是 value fields Str or fields List 我
  • PHP 扩展未在 phpinfo 中加载

    所以我在 Mountain Lion 上运行 MAMP 并使用 pecl 安装了 gmagick 和 imagick 两者都是 relase 候选者 主要是因为 gmagick 没有稳定的版本并且 imagick 3 0 0 没有安装 它给
  • 公共功能与公共时段

    在我一年的 Qt 编程中 我学到了很多关于信号和槽的知识 但还不够 http doc qt io qt 5 signalsandslots html 插槽可以用来接收信号 但也是正常的 成员函数 那么 有什么理由不声明继承自的类中的每个函数
  • dartlang中的double.toStringAsFixed和toStringAsPrecision有什么区别?

    我想知道这两种方法有什么区别 我想toStringAsFixed修剪数字 但从 doc 中的示例来看 两者都对数字进行四舍五入 这是相关问题 https github com dart lang sdk issues 25947 1 Dou
  • 如何在 Xcode 4 中进行代码设计和沙箱助手应用程序?

    这就是问题 我有一个包含 HelperApp 的 MainApp Helper 应用程序用于登录项 因此我需要区分 MainApp 和 HelperApp 捆绑 ID 感谢 BuildPhase Copy 我将 HelperApp 复制到
  • X11 鼠标移动事件

    在 XLib 中创建窗口时 我提供给大家的口罩有哪些SetWindowAttributes event mask成员 我必须将什么传递给第 11 个参数XCreateWindow 我在主消息循环中寻找的事件是什么 我使用的地方XNextEv
  • 如何将 WSDL 文件转换为类文件

    我有一个 WSDL 文件 我想将 wsdl 文件转换为 Web 服务类文件 是否可以 如果是的话请详细地向我解释一下 在解决方案资源管理器中右键单击 您的项目并转到 添加服务 参考 按窗口底部的 高级 按窗口底部的 添加 Web 引用 在
  • Android TabLayout一旦切换fragment就不再显示内容

    我在我的项目中使用导航抽屉 其中有 5 个片段 在一个片段中 我在设计支持库中引入了 TabLayout 其中包括 2 个片段 一切正常 除了当我离开具有 TabLayout 的片段并切换回它时 所有内容都消失了 在 TabLayout 中
  • 悬停时从下到上更改背景

    我如何更改背景颜色a hover使用持续时间为 0 3 秒的从底部到顶部的过渡 ul li a a li li a a li li a a li ul 那可能吗 Thanks 没有办法 一般 在 CSS 中应用过渡方向 然而 我们可以解决办
  • 从多维数组中递归删除空元素和子数组

    我似乎找不到一个简单 直接的解决方案来解决 PHP 中从数组中删除空元素的老问题 我的输入数组可能如下所示 Array 0 gt Array Name gt EmailAddress gt 等等 如果有更多的数据 虽然可能没有 如果它看起来
  • 显示 UIActionSheet

    我想知道如何从屏幕底部显示 UIActionSheet 我尝试过使用showInView 方法与MainView作为显示它的视图 但我得到了MainView Undeclared error 您需要引用控制器视图 actionSheet s
  • 如何在java中以相同的顺序洗牌两个数组

    我有两个问题和答案数组 String questions Q1 Q2 Q3 String answers A1 A2 A3 I used Collections shuffle Arrays asList questions 打乱每个数组
  • Python 数组切片带有逗号?

    我想知道在切片 Python 数组时逗号的用途是什么 我有一个似乎有效的示例 但对我来说看起来很奇怪的行是 p 20 numpy log10 numpy abs numpy fft rfft data 2048 0 现在 我知道在对数组进行
  • 声明特定资源的授权

    我正在编写一个示例文件存储系统 仅用于 stackoverflow 的示例 我当前的域模型如下所示 public class User public int ID get set public string LoginIdentifier