声明特定资源的授权

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(使用前将#替换为@)

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

  • 如何从 SOAP 响应中删除额外的结果标签

    我知道这个问题以前曾被问过 但我在任何地方都找不到答案 问题是我的 asmx 文件中有以下代码 namespace IrancellSmsServer SoapDocumentService RoutingStyle SoapService
  • 如何以一种形式发布两个或多个模型?

    我正在为一个项目开发互联网课程计划应用程序 该课程计划是根据以下模型构建的 使用数据库优先方法中的实体框架生成 public partial class Subject public int Id get set public string
  • VS2017在nuget包中将“Build Action”设置为“Content”

    我创建我的nuget包在gitlab使用以下命令行 nuget pack Prop Configuration Release OutputDirectory nuget REPONAME APPNAME APPNAME csproj 如果
  • 生成Excel文件错误

    我在经典 ASP 中使用以下代码生成 Excel 文件 代码很简单并且有效 我在 Windows Vista x86 上的 IIS 7 0 下运行代码 两个问题 有一个奇怪的警告框 这是屏幕快照 http i27 tinypic com 2
  • VS 2010 Web应用程序中的ASP.NET Web Api CRUD操作

    我尝试在 VS 2010 Web 应用程序中进行 ASP NET Web Api CRUD 操作 但为什么结果没有从源表返回所有整行 这是我的代码 路线 Globax asax protected void Application Star
  • 生成 .tail IL 指令的简单 F# 代码是什么?

    我想看看 tailIL 指令 但我一直在编写的使用尾部调用的简单递归函数显然已优化为循环 我实际上是在猜测这一点 因为我不完全确定反射器中的循环是什么样的 我绝对没有看到任何 tail不过操作码 我在项目的属性中检查了 生成尾部调用 我还尝
  • 我应该如何在 VB.NET 中进行转换?

    所有这些都相等吗 在什么情况下我应该选择其中一个而不是其他 var ToString CStr 变量 CType 变量 字符串 DirectCast 变量 字符串 编辑 来自的建议不是我自己 https stackoverflow com
  • 在 .NET 中记录 StackOverflowException

    最近 我的 NET 应用程序 asp net 网站 中出现了堆栈溢出异常 我之所以知道该异常是因为它出现在我的 EventLog 中 我知道 StackOverflow 异常无法被捕获或处理 但是有没有办法在它杀死您的应用程序之前记录它 我
  • 反序列化嵌套类时不需要 xmlns=''

    我在尝试在服务器上序列化类 将其发送到客户端并在目标上反序列化时遇到问题 在服务器上我有以下两个类 XmlRoot StatusUpdate public class GameStatusUpdate public GameStatusUp
  • 重写某些 .Net Framework 控件的绘制以更改其边框颜色?

    SCENARIO 我正在使用第三方 Windows 视觉主题 当我看到我的应用程序时 它看起来像这样 但是当我使用正常的Aero主题 它看起来到处都有可怕的白色边框 QUESTION 我知道应用程序中使用的配色方案取决于视觉风格 但是 我可
  • C# 7 表达式主体构造函数

    在 C 7 中 如何使用 2 个参数编写这样的表达式主体构造函数 public Person string name int age Name name Age age 一种方法是使用元组和解构来允许在一个表达式中进行多次赋值 public
  • 高度并行化的Levenshtein距离算法

    实际上 我必须实现一个字符串比较 最后得到匹配百分比 不仅仅是布尔结果匹配 不匹配 为此 我找到了 Levenstein 距离算法 但现在的问题是性能 例如 我有 1k 个字符串需要相互比较 现在大约需要 10 分钟 对于每个算法 我已经并
  • .NET 中严格浮点数学的库

    我有 Java 算法 计算及其单元测试 单元测试期望结果具有一定的精度 增量 现在我将算法移植到 NET 中 并希望使用相同的单元测试 我使用双数据类型 问题在于 Java 使用 strictfp 64 位 来执行 Math 类中的某些操作
  • 当用户打开文件时如何锁定对文件的访问?

    我正在编写一个 C NET 程序 该程序使用 XmlSerializer 对当前用户正在处理的项目与 XML 文件进行序列化和反序列化 这工作正常 但我试图找到一种方法来防止两个用户从网络驱动器打开同一个文件并让一个用户覆盖前一个用户的保存
  • WCF 服务调用包装器

    为 WCF 服务调用创建包装器的最佳实践是什么 我认为有必要 为了在同一个地方监视所有呼叫 我正在考虑使用这种代码 这是正确的想法吗 RetType t ServiceExecutionContext
  • DataGridView 中的 C# FormatException

    我创建了一个带有一些列的 DataGridView 订单列仅允许用户输入 int 数字 当我输入 j 例如 时 它会抛出 FormatException 并且我尝试添加 try catch 来解决问题 但它看起来不起作用 private v
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 如何区分用户点击链接和页面自动重定向?

    拥有 C WebBrowser control http msdn microsoft com en us library system windows forms webbrowser aspx在我的 WinForms 应用程序中 并意识
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动

随机推荐

  • 使用 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