C# Azure上的用户授权

C# Azure上的用户授权,c#,session,authentication,cookies,azure,C#,Session,Authentication,Cookies,Azure,我正在为azure从头开始写一个网站。每个用户都拥有多个对象的所有权,并拥有多个权限。这些因素共同决定了他们有权做什么。问题是,这些信息应该如何存储。我想自己使用自定义逻辑进行身份验证 出于性能原因,我希望在每个用户登录后缓存这些授权列表。有人能给我一个如何安全有效地存储和访问此会话信息的示例吗 编辑 我研究了应用程序结构访问控制,但这似乎有些过分,因为我将不得不创建一个单独的站点进行身份验证,这似乎没有什么意义。但是,基于声明的身份验证是否有意义?如果是的话,你会怎么做 以传统的方式将用户名保

我正在为azure从头开始写一个网站。每个用户都拥有多个对象的所有权,并拥有多个权限。这些因素共同决定了他们有权做什么。问题是,这些信息应该如何存储。我想自己使用自定义逻辑进行身份验证

出于性能原因,我希望在每个用户登录后缓存这些授权列表。有人能给我一个如何安全有效地存储和访问此会话信息的示例吗

编辑

我研究了应用程序结构访问控制,但这似乎有些过分,因为我将不得不创建一个单独的站点进行身份验证,这似乎没有什么意义。但是,基于声明的身份验证是否有意义?如果是的话,你会怎么做

以传统的方式将用户名保存在cookie中,然后在每次请求时重新查询表存储以获得权限等,这样做更有意义吗。?在Azure中如何存储用户名


成本是一个很大的因素,因为它是一个非常小的站点(按azure标准),但我希望为少数用户提供高性能。

好的,您可以使用azure App Fabric缓存来存储会话信息。ASP.Net可以配置为将其用作会话状态的备份存储,就像普通的自定义会话状态提供程序一样

MSDN的这篇文章向您展示了如何配置它:

从代码中,您只需使用普通的ASP.Net方式获取/设置状态


不过要注意,这可能会很昂贵(128MB缓存每月45美元)。

如果您想以合理的可用性运行,您需要使用两个实例来运行您的站点。如果您使用两个实例运行,则需要使用一个会话提供程序,该提供程序不是默认的InProc提供程序。你的选择是:

  • AppFabric缓存(您不想使用它,因为它太贵、太公平)
  • Azure存储会话提供程序。这是一个有趣的实验,但它只是示例代码,速度很慢,在生产中无法很好地处理
  • SQL Server会话提供程序
如果用户登录时的权限不会更改,您可以将其权限存储在会话中。这可能足够快了。但是,对于使用会话的每个请求,都需要从SQL中读取此信息,这是开销


如果您想让事情变得更快,您可以将用户ID存储在会话中,并在需要时将权限加载到静态字典中(键入用户ID)。这些物品需要在一段时间后或未使用时过期。

+1获得一个好的建议。不幸的是,这样的成本太高了,而且,考虑到我怀疑自己会使用其中的一小部分,这是相当浪费的(问题是,除非您只使用单个角色实例,否则您需要一个分布式缓存,或像表存储这样的持久存储,然后您又回到了性能问题中。我会感到惊讶的是,Azure上的StateServer模式工作正常。但如果您只有一个角色实例,则不会获得高可用性保证,Azure看起来有点浪费。很棘手。您是将权限映射到角色,然后将用户分配到角色,还是将权限直接映射到用户。如果您将角色用作抽象点,并且权限/角色没有更改,那么您可以保留角色/权限结构内存-在所有实例中都是相同的。然后,您需要的只是验证机制来为每个用户提供角色声明。它必须在Azure上吗?在某些方面,您最好使用支持StateServer会话状态模式的良好托管提供商。由于成本是一个因素,Azure的计算成本要高得多han GoDaddy或类似网站的托管成本。我在Azure中做了一部分实验,我还想要正常运行时间保证。我还打算与我创建和管理的其他网站共享Azure上的托管空间,这将使计算成本更加合理。@Mike A claim应该能够持有一份权限列表?我只是没有真的确定如何创建/存储该声明,以使其在请求之间持久化吗?