0

一旦通过身份验证,我将使用它HttpContext.Current.User.Identity.Name;来确保用户有权查看我的网站的一部分。

当我访问网站的某些部分时,我需要获取用户并获取他们登录的上下文(他们登录的组织),url类似于settings/supercompany/profile. 其中supercompany是当前上下文。

对于每个用户,我需要检查他们是该公司的管理员还是普通用户,如果是普通用户,那么他们看不到某些东西。

public class SettingsApi
{
    private readonly string _userId;
    private readonly string _contextId;

    public SettingsApi(string userId, string contextId)
    {
        _userId = userId;
        _contextId = contextId;
    }
}

如果我从控制器(发布或获取)实例化上面的类,缓存会以某种方式搞砸吗?用户角色改变了,我不接?像下面这样的东西会很好用吗?

var settings = new SettingsApi(HttpContext.Current.User.Identity.Name, currentContextId);
settings.IsAdmin();

注意:我会使用属性进行授权,但我的要求是我需要从 URL 中挑选出 currentContext ,而且我需要在代码的其他地方使用上面的类。

更新

AuthorizeAttribute适用于缓存,但用于授权的方法即

    protected override bool AuthorizeCore(HttpContextBase httpContext)

不会把我需要的类的实例交还给我......

更新 2我不希望此类或此类的实例被缓存,每次我要求一个新实例时,我都不介意从数据库中获取一个......

我的问题 - 我编码的方式好吗?我的用户和他的权限不会被缓存吗?

4

2 回答 2

0

如果您不小心,有可能让 MVC 缓存经过身份验证的用户的第一个请求的输出。我使用 VaryByCustom 和当前身份的名称。

[OutputCache(VaryByCustom="user")]
public class SomeController : Controller
{
  // etc.
}

在我的 Global.asax.cs 我定义:

public override string GetVaryByCustomString(HttpContext context, string custom)
{
    if (custom.Equals("user", StringComparison.OrdinalIgnoreCase))
    {
        return context.User.Identity.IsAuthenticated ? context.User.Identity.Name : string.Empty;
    }
    return base.GetVaryByCustomString(context, custom);
}
于 2012-05-21T09:55:34.180 回答
0

如果您建议将 SettingsApi 的实例添加到缓存中,那么它肯定不会起作用,因为缓存是应用程序范围的,因此所有用户最终将共享相同的 SettingsApi。使用 OutputCache 应该没问题(只要您不执行诸如将 userid 放在隐藏字段中并使用 [OutputCache(VaryByCustom="user")] 或类似的操作)。

如果您希望缓存 SettingsApi,您应该通过每个用户/会话的 SessionState 来执行此操作,并且不会影响身份验证。

于 2012-05-21T09:58:47.963 回答