草庐IT

c# - ASP.NET MVC : Relationship between MembershipUser, 标识、MembershipProvider 和主体

coder 2024-05-22 原文

我需要在 ASP.NET MVC 应用程序中使用一些功能,经过一些研究后,我觉得我必须实现自定义 MembershipUser、MembershipProvider、Identity 和 Principal。 我的问题是:我不明白 MembershipUser 和 Identity 之间的关系(如果有的话)以及 MembershipProvider 和 Principal 的确切位置。 有人可以解释一下吗?我在网络上发布了多篇关于这四位玩家的文章和教程,但没有一篇完整地阐述了他们之间的关系。

此外:除了在 Global.asax 中的 AuthenticateRequest 期间,是否有一种优雅的方式将自定义主体分配给 Context.User?我已经看到很多关于如何在 ASP.NET WebForms 应用程序中执行此操作的示例,我想知道 ASP.NET MVC 是否有更好的方法。

最佳答案

IPrincipal是为每个 Web 请求创建的安全上下文,包含与用户身份和他们拥有的角色相关的信息。

IPrincipal 包含一个 IIdentity具有 NameIsAuthenticatedAuthenticationType 属性。

自定义 MembershipProvider 是派生自抽象类 MembershipProvider 的类,用于提供有关使用您的应用程序的用户的自定义数据。提供商将在 MembershipUser 上运行类型,可用于获取特定用户的数据、创建新用户等。您可以从 MembershipUser 继承以创建您自己的用户类型,并且通常希望在使用您的用户时执行此操作自己的供应商。

当您访问应用程序时,将创建一个IPrincipalIIdentity 并将其分配给HttpContext.Current.User。和 Thread.CurrentPrincipal为在请求的生命周期内可能采取的任何行动提供安全信息。

如果您使用的是 RoleProvider,那么 RolePrincipal创建类型实例,它挂接到配置的 RoleProvider 以获取用户的角色;如果您不使用 RoleProvider,则使用 GenericPrincipal类型实例被创建。

如果您正在使用表单例份验证并且用户已登录,那么 FormsIdentity类型实例已创建;如果用户未通过身份验证,则 GenericIdentity类型实例被创建。创建的 IIdentity 最终将被序列化为传递回浏览器的身份验证 cookie,并将用于构造 FormsAuthenticationTicket。和下一个请求的 IIdentity

MembershipProvider 通过提供有关用户的附加信息来适应这一点。静态 Membership类(class)的GetUser()方法将使用当前的 IIdentity.Name 和配置的 MembershipProvider 返回 MembershipUser 的实例(或者派生类,如果你定义了一个)包含有关用户的数据。

由于 ASP.NET MVC 是建立在 ASP.NET 处理管道之上的,因此您想要设置自己的 IIdentityIPrincipal 的地方是相同的.据我所知,在 MVC 架构中没有比这更好的地方来设置它们了。

注意:这都是凭内存。如果我有什么不对的地方,请告诉我,我会更新。

关于c# - ASP.NET MVC : Relationship between MembershipUser, 标识、MembershipProvider 和主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5610506/

有关c# - ASP.NET MVC : Relationship between MembershipUser, 标识、MembershipProvider 和主体的更多相关文章

  1. c# - 如何在 ruby​​ 中调用 C# dll? - 2

    如何在ruby​​中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL

  2. C# 到 Ruby sha1 base64 编码 - 2

    我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha

  3. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  4. ruby-on-rails - 如何从过时的 TZInfo 标识符中获取 Rails TimeZone 名称? - 2

    已经有一个问题回答了如何将“America/Los_Angeles”转换为“PacificTime(US&Canada)”。但是我想将“美国/太平洋”和其他过时的时区转换为RailsTimeZone。我无法在图书馆中找到任何可以帮助我完成此任务的东西。 最佳答案 来自RailsActiveSupport::TimeZonedocs:TheversionofTZInfobundledwithActiveSupportonlyincludesthedefinitionsnecessarytosupportthezonesdefinedb

  5. ruby - 在 ASP 页面上 Mechanize 中断 - 2

    require'mechanize'agent=Mechanize.newlogin=agent.get('http://www.schoolnet.ch/DE/HomeDE.htm')agent.clicklogin.link_withtext:/Login/然后我得到Mechanize::UnsupportedSchemeError。 最佳答案 Mechanize不支持javascript但您可以将搜索字段添加到表单并为其分配搜索词并使用mechanize提交表单form=page.forms.firstform.add_fie

  6. ruby - 如何从 nokogiri 对象获取标识符(例如 xpath)? - 2

    遍历nokogiri并使用xpath选择元素相当容易。我需要这个反之亦然,意思是:我需要例如在nokogiri节点上调用.to_xpath以获取元素的完整xpath以将其存储在记录中。有人知道这样做的方法吗? 最佳答案 我能想到的最简单的方法是:Nokogiri::CSS.xpath_fornode.css_path编辑:您也可以尝试使用path方法。 关于ruby-如何从nokogiri对象获取标识符(例如xpath)?,我们在StackOverflow上找到一个类似的问题:

  7. c# - C# 中的 Flatten Ruby 方法 - 2

    我如何做Ruby方法"Flatten"RubyMethod在C#中。此方法将锯齿状数组展平为一维数组。例如:s=[1,2,3]#=>[1,2,3]t=[4,5,6,[7,8]]#=>[4,5,6,[7,8]]a=[s,t,9,10]#=>[[1,2,3],[4,5,6,[7,8]],9,10]a.flatten#=>[1,2,3,4,5,6,7,8,9,10 最佳答案 递归解决方案:IEnumerableFlatten(IEnumerablearray){foreach(variteminarray){if(itemisIEnume

  8. ruby - 可以像在 C# 中使用#region 一样在 Ruby 中使用 begin/end 吗? - 2

    我最近从C#转向了Ruby,我发现自己无法制作可折叠的标记代码区域。我只是想到做这种事情应该没问题:classExamplebegin#agroupofmethodsdefmethod1..enddefmethod2..endenddefmethod3..endend...但是这样做真的可以吗?method1和method2最终与method3是同一种东西吗?还是有一些我还没有见过的用于执行此操作的Ruby惯用语? 最佳答案 正如其他人所说,这不会改变方法定义。但是,如果要标记方法组,为什么不使用Ruby语义来标记它们呢?您可以使用

  9. c# - Ruby 等效于 C# Linq 聚合方法 - 2

    什么是Linq聚合方法的ruby​​等价物。它的工作原理是这样的varfactorial=new[]{1,2,3,4,5}.Aggregate((acc,i)=>acc*i);每次将数组序列中的值传递给lambda时,变量acc都会累积。 最佳答案 这在数学以及几乎所有编程语言中通常称为折叠。它是更普遍的变形概念的一个实例。Ruby从Smalltalk中继承了这个特性的名称,它被称为inject:into:(像aCollectioninject:aStartValueinto:aBlock一样使用。)所以,在Ruby中,它称为inj

  10. ruby-on-rails - 给定长度的完全随机标识符 - 2

    我想生成一个包含数字、字母和特殊字符的给定(长度可能不同)长度的完全随机的“唯一”(我将确保使用我的模型)标识符例如:161551960578281|2.AQAIPhEcKsDLOVJZ.3600.1310065200.0-514191032|有人可以建议在RubyonRails中最有效的方法吗?编辑:重要:如果可能,请评论您提出的解决方案的效率,因为每次用户进入网站时都会使用它!谢谢 最佳答案 将其用于访问token与UUID不同。您不仅需要伪随机性,而且还需要加密安全PRNG.如果您真的不关心您使用的是什么字符(它们不会增加任何

随机推荐