尽管我已经在这里呆了一段时间,这是我第一个有关SO的问题,所以请和我温柔.

我正在使用ASP.NET MVC 3,我想创建一个自定义的主体,所以我可以存储一些关于当前用户的信息比标准,因此不必经常去数据库.这是我以后的相当标准的东西.我们先说一下电子邮件地址和用户ID.

我已经决定将对象存储在缓存中,因为我知道不建议将其存储在会话中.

我也不想要继续投射User对象,所以我想覆盖控制器中的User对象.所以我可以去User.UserId并保证一些东西.

所以我创建了一个这样的自定义的主体:

public class MyPrincipal : IPrincipal
{
    public MyPrincipal(IIdentity ident,List<string> roles,string email,Guid userId)
    {
        this._identity = ident;
        this._roles = roles;
        this._email = email;
        this._userId = userId;
    }

    IIdentity _identity;

    public IIdentity Identity
    {
        get { return _identity; }
    }

    private List<string> _roles;

    public bool IsInRole(string role)
    {
        return _roles.Contains(role);
    }

    private string _email;

    public string Email
    {
        get { return _email; }
    }

    private Guid _userId;

    public Guid UserId
    {
        get { return _userId; }
    }
}

我有一个这样的基本控制器:

public class BaseController : Controller
    {
        protected virtual new MyPrincipal User
        {
            get
            {
                if (base.User is MyPrincipal)
                {
                    return base.User as MyPrincipal;
                }
                else
                {
                    return new MyPrincipal(base.User.Identity,new List<string>(0),"",Guid.Empty );
                }
            }
        }

        protected override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (User != null)
            {
                if (User.Identity.IsAuthenticated)
                {
                    if (User.Identity is FormsIdentity)
                    {
                        FormsIdentity id = base.User.Identity as FormsIdentity;
                        MyPrincipal principal = (MyPrincipal)filterContext.HttpContext.Cache.Get(id.Name);
                        if (principal == null)
                        {
                            MembershipUser user = Membership.GetUser();

                            // Create and populate your Principal object with the needed data and Roles.
                            principal = new MyPrincipal(id,Roles.GetRolesForUser(id.Name).ToList(),user.Email,(Guid)user.ProviderUserKey);
                            filterContext.HttpContext.Cache.Add(
                            id.Name,principal,null,System.Web.Caching.Cache.NoAbsoluteExpiration,new System.TimeSpan(0,30,0),System.Web.Caching.CacheItemPriority.Default,null);
                        }
                        filterContext.HttpContext.User = principal;
                        System.Threading.Thread.CurrentPrincipal = principal;
                        base.OnAuthorization(filterContext);
                    }
                }
            }
        }
    }

如果你看看你会很快意识到,如果用户没有登录,那么对User对象的任何调用将不得不运行这一段代码:

return new MyPrincipal(base.User.Identity,Guid.Empty );

这对我来说感觉非常低效,尽管它只是为缺少的东西创建空的对象.

工作正常

所以我想我想知道这是否真的可以,我应该停止对性能和效率这么肛门,或者如果我的恐惧是正确的,那我该怎么办呢? [请不要说“得到生命,伴侣!”]

解决方法

不,这个代码从表现的角度来看没有什么特别的错误.对象的PLENTY正在ASP.NET的后端创建,您的单个对象是一个下拉列表.由于课程实例化非常快,我不会担心.

为什么在这里忽略会话?会话信息没有到期日期,因此幕后没有额外的检查.除非你使用的是一个out of session会话服务器,否则你的对象没有序列化(没有缓存).
缓存是为每个用户 – 所以你有一个代码错误的机会(尽管很小),返回错误的主体,每个用户的缓存不会有风险.

如果你想要这个可用的所有请求(不只是基于MVC)我会考虑设置在Application_PostAuthenticateRequest

c# – 这个基础控制器中的自定义主体ASP.NET MVC 3是非常低效的?的更多相关文章

  1. 使用xib创建自定义视图

    但是,您必须接受您的XIB将包含根视图或其他内容,这些视图将作为子视图添加到放入Placement的类的实例中.这样,你应该有类似的东西:XIB与您的自定义视图内容:添加XIB的位置:由于添加到展示位置的视图实例与XIB中的文件所有者相同,因此您可以在XIB和Placement中设置出口和操作.只是不要忘记你的XIB中的根视图不是UIKit将创建放置到Placement的实例.为方便起见,请在下面找到我的代码,该代码是基类,以便于创建此类视图:

  2. 防止序列为空

    作者:EricaSadun,原文链接,原文日期:2016-05-11译者:pucca;校对:wiilen;定稿:CMB昨天在Swift-Users有人提问如何防止序列为空。这个问题来源于如何在断言中测试一个序列,由此引发的问题是如果序列为空,会返回true来满足断言。我们先不考虑这种处理是否有问题,JeremyPereira提出了一个相当巧妙的解决方案:但从此讨论中延伸出的另一个大问题是“如何优雅地判断一个序列是否为空?”。本文由SwiftGG翻译组翻译,已经获得作者翻译授权,最新文章请访问http://

  3. 为什么在Swift中甚至需要便利关键字?

    由于Swift支持方法和初始化程序重载,因此可以将多个init放在一起,并使用任何您认为方便的:那么为什么便利关键字也存在呢?`我在thisanswer年轻微触及它,其中我详细地覆盖了Swift的初始化规则,但主要关注的是所需的词。因为Swift不允许未初始化的变量,所以不能保证从你继承的类继承所有(或任何)初始化器。所以方便关键字做的是告诉我们哪些初始化器可以被添加没有默认值的实例变量的子类继承。它只意味着Inheritor只有一个指定的初始化器。

  4. swift – 检查Hashable一致性

    我有一个基本协议(模型),一些结构符合.它们也符合Hashable我有一个函数,它接受一个符合Model的对象数组.如何将[Model]传递给需要Hashables而不制作ModelHashable的函数?我试图避免这种情况因为当我这样做时,我得到“模型不能用作通用约束……”

  5. swift – Sprite-kit:在圆形路径中移动元素

    我正试图让元素在cercle的边缘移动.>我已经在屏幕中间创建并定位了一个cercle:>然后我创建了另一个精灵并在其上添加了一个动作:宇宙飞船的第一次旋转(见下图)完全遵循圆的边缘,但第二次迭代改变了宇宙飞船的位置并将其移出屏幕边界.这是正常的还是我做错了什么?

  6. 如何在Swift中用它创建类和实例对象的数组?

    能够实例化适当的对象?您只需要一个必需的init,一些方法来创建一个实例,该实例将在您希望其工作的所有类型之间共享.保存init方法的协议可以正常工作.显然,当init不需要参数时,这种方法最简单.缺点是您需要向下转换结果实例.

  7. JSP页面文件中base标记用法实例分析

    这篇文章主要介绍了JSP页面文件中base标记用法,以实例形式较为详细的分析了JSP中base标记的功能与具体使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下

  8. PHP 实现base64编码文件上传出现问题详解

    这篇文章主要介绍了PHP 实现base64编码文件上传出现问题详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

  9. js继承 Base类的源码解析

    Base据说是最好的js继承的封装类,最近读了一下base2.js的继承部分,现在将源码的解析贴下,有错误的地方希望大家指出,我会更新的.

  10. javascript Base类 包含基本的方法

    一个Base类,包含基本的方法,大家可以在这个基础上拓展下功能。

随机推荐

  1. c# – (wpf)Application.Current.Resources vs FindResource

    所以,我正在使用C#中的WPF创建一个GUI.它看起来像这样:它现在还没有完成.这两行是我尝试制作一种数据表,它们在XAML中是硬编码的.现在,我正在C#中实现添加新的水果按钮功能.我在XAML中有以下样式来控制行的背景图像应该是什么样子:因此,在代码中,我为每列col0,col1和col2创建一个图像,如果我使用以下代码,它添加了一个如下所示的新行:如你所见,它不太正确……为什么一个似乎忽略了一些属性而另一个没有?

  2. c# – 绑定DataGridTemplateColumn

    似乎我已经打了个墙,试图在DataGrid上使用DataTemplates.我想要做的是使用一个模板来显示每个单元格的两行文本.但是似乎无法以任何方式绑定列.以下代码希望显示我想做的事情.注意每个列的绑定:模板列没有这样的东西,因此,这个xaml不可能工作.我注定要将整个DataTemplate复制到每个列,只是对每个副本都有不同的约束?解决方法我不完全确定你想要做什么,但如果您需要获取整行的DataContext,可以使用RelativeSource绑定来移动视觉树.像这样:

  3. c# – 学习设计模式的资源

    最近我来到了这个设计模式的概念,并对此感到非常热情.你能建议一些帮助我深入设计模式的资源吗?

  4. c# – 是否有支持嵌入HTML页面的跨操作系统GUI框架?

    我想开发一个桌面应用程序来使用跨系统,是否有一个GUI框架,允许我为所有3个平台编写一次代码,并具有完全可脚本化的嵌入式Web组件?我需要它有一个API来在应用程序和网页之间进行交流.我知道C#,JavaScript和一些python.解决方法Qt有这样的事情QWebView.

  5. c# – 通过字符串在对象图中查找属性

    我试图使用任意字符串访问嵌套类结构的各个部分.给出以下(设计的)类:我想要从Person对象的一个实例的“PersonsAddress.HousePhone.Number”获取对象.目前我正在使用反思来做一些简单的递归查找,但是我希望有一些忍者有更好的想法.作为参考,这里是我开发的(crappy)方法:解决方法您可以简单地使用标准的.NETDataBinder.EvalMethod,像这样:

  6. c# – 文件下载后更新页面

    FamilyID=0a391abd-25c1-4fc0-919f-b21f31ab88b7&displaylang=en&pf=true它呈现该页面,然后使用以下元刷新标签来实际向用户提供要下载的文件:你可能需要在你的应用程序中做类似的事情.但是,如果您真的有兴趣在文件完全下载后执行某些操作,那么您的运气不佳,因为没有任何事件可以与浏览器进行通信.执行此操作的唯一方法是上传附件时使用的AJAXupload.

  7. c# – 如何在每个机器应用程序中实现单个实例?

    我必须限制我的.net4WPF应用程序,以便每台机器只能运行一次.请注意,我说每个机器,而不是每个会话.我使用一个简单的互斥体实现单实例应用程序,直到现在,但不幸的是,这样一个互斥是每个会话.有没有办法创建机器互连,还是有其他解决方案来实现每个机器应用程序的单个实例?

  8. c# – WCF和多个主机头

    我的雇主网站有多个主机名,都是同一个服务器,我们只是显示不同的皮肤来进行品牌宣传.不幸的是,在这种情况下,WCF似乎不能很好地工作.我试过overridingthedefaulthostwithacustomhostfactory.这不是一个可以接受的解决方案,因为它需要从所有主机工作,而不仅仅是1.我也看过thisblogpost,但是我无法让它工作,或者不是为了解决我的问题.我得到的错误是“这

  9. c# – ASP.NET MVC模型绑定与表单元素名称中的虚线

    我一直在搜索互联网,试图找到一种方式来容纳我的表单元素的破折号到ASP.NET的控制器在MVC2,3或甚至4中的默认模型绑定行为.作为一名前端开发人员,我更喜欢在我的CSS中使用camelCase或下划线进行破折号.在我的标记中,我想要做的是这样的:在控制器中,我会传入一个C#对象,看起来像这样:有没有办法通过一些正则表达式或其他行为来扩展Controller类来适应这种情况?我讨厌这样的事实,我必须这样做:甚至这个:思考?

  10. c# – 用户界面设计工具

    我正在寻找一个用户界面设计工具来显示文档中可能的GUI.我不能生成代码.我知道MicrosoftVisio提供了一个功能.但有什么办法吗?您使用哪种软件可视化GUI?

返回
顶部