2011-11-10 134 views
2

我正在从头开始重新编写网站以获取天蓝色。每个用户拥有多个对象,并拥有许多权限。这些共同决定了他们有权做什么。问题是,这些信息应该如何存储。我想使用自定义逻辑自己进行身份验证。Azure上的用户授权

由于性能方面的原因,我想在每次登录后为每个用户缓存这些授权列表。有人可以给我一个示例,了解如何安全有效地存储此会话信息的&。

编辑

我看着进入App面料访问控制,但似乎矫枉过正,因为我将不得不创建认证一个单独的网站,这似乎没有什么意义。基于认证的索赔是否会分开使用?如果是这样,你会怎么做?

将传统方式中的用户名保存在cookie中,然后用每个请求重新查询表存储以获得权限等是否更合理?如何将用户名存储在Azure中?

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

+0

您是否将权限映射到角色,然后将用户分配给角色,还是将权限直接映射到用户?如果您将角色用作抽象点,并且权限/角色不会更改,那么您可以将角色/权限结构保存在内存中 - 在所有实例中都是相同的。您需要的仅仅是为每个用户提供角色声明的身份验证机制。 –

+0

它必须在Azure上吗?在某些情况下,您最好在支持StateServer会话状态模式的良好托管服务提供商处。由于成本是一个因素,Azure的计算成本远高于GoDaddy或类似的托管成本。 –

+0

我在Azure中做了一个实验,我也想要正常运行时间保证。我还打算与我创建和管理的其他网站共享Azure上的主机空间,这将使计算成本更加合理。 – ForbesLindesay

回答

1

如果您希望以合理的可用性运行,则需要使用两个实例运行您的站点。如果您正在运行两个实例,则需要使用不属于默认InProc的会话提供程序。你的选择是:

  • AppFabric缓存(你不想使用,因为它太贵了,很公平)
  • Azure存储会话提供。 Don't use this。这是一个有趣的实验,但它只是示例代码,它很慢,并且在生产中不能很好地处理。
  • SQL Server会话提供程序。

如果用户的权限在登录时不会改变,您可以将其权限存储在会话中。这可能会足够快。但是,对于使用会话的每个请求,这些信息都需要从SQL中读取,并且开销较大。

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

1

那么,您可以使用Azure App Fabric缓存来存储会话信息。可以将ASP.Net配置为将其用作会话状态的后备存储,就像正常的自定义会话状态提供程序一样。

本文从MSDN展示了如何配置它:

http://msdn.microsoft.com/en-us/library/windowsazure/gg278339.aspx

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

请注意 - 它可能是昂贵的(每128美元缓存45美元)。

+0

+1提供了一个很好的建议。不幸的是,成本会过高,鉴于我怀疑我会使用超过一小部分,非常浪费。 – ForbesLindesay

+0

对不起:o(问题是,除非你只使用一个单一的角色实例,你需要一个分布式缓存或者像表存储这样的持久性存储,然后你又回到了性能问题,我很惊讶的是StateServer模式在Azure上工作,但是如果你有一个单一的角色实例,你不会得到高可用性保证,Azure看起来有点浪费。 –