Asp.net mvc 2 如何在ASP.NET MVC中实现自定义主体和标识?

Asp.net mvc 2 如何在ASP.NET MVC中实现自定义主体和标识?,asp.net-mvc-2,forms-authentication,identity,principal,Asp.net Mvc 2,Forms Authentication,Identity,Principal,我想在经过身份验证的用户中存储额外的信息,以便可以轻松访问它(例如,像user.Identity.Id),而不仅仅是名称,因为我计划使用非唯一的名称 到目前为止,我认为应该实现自定义主体和/或标识,但我不确定如何实现。我一直在寻找关于这个问题的文档和教程,但是我在不同的地方找到了相关的东西,我觉得有点困惑 我已经看到了如何将自定义信息添加到用户数据属性中的身份验证cookie中,但是我希望获得单元测试的依赖注入的好处,这可以与主体和标识一起使用 < >如果我想实现自己的主体或身份,我需要考虑的是

我想在经过身份验证的用户中存储额外的信息,以便可以轻松访问它(例如,像user.Identity.Id),而不仅仅是名称,因为我计划使用非唯一的名称

到目前为止,我认为应该实现自定义主体和/或标识,但我不确定如何实现。我一直在寻找关于这个问题的文档和教程,但是我在不同的地方找到了相关的东西,我觉得有点困惑

我已经看到了如何将自定义信息添加到用户数据属性中的身份验证cookie中,但是我希望获得单元测试的依赖注入的好处,这可以与主体和标识一起使用

< >如果我想实现自己的主体或身份,我需要考虑的是<强>精确/ <强>步骤?

在这个场景中,我能做的最简单的事情是什么(只需添加ID并保留所有默认值)?“默认设置”将包括默认提供程序(成员资格、角色等)

我已经看过了,但我希望答案之间不会留下任何漏洞,例如示例中AuthenticateRequest事件中的角色魔术字符串。相反,我需要知道如何将默认SqlRoleProvider中的角色添加到当前用户:何时何地添加,以及是否需要执行任何其他操作以将我的新类与其他默认提供程序连接

如果能够访问示例ASP.NETMVC2应用程序(例如,来自VisualStudio2010模板),进行编辑并使其正常工作,那就太棒了


编辑:我对问题进行了编辑,以更好地表明我在这里几乎迷路了,所以我不能接受太高层次的答案


p.S.:在我看来,在身份中使用ID而不是校长更为合理,尽管在某种程度上,我之前已经说过这一点。

这个问题以前已经被问过并回答过:

但总而言之

用要存储的其他属性包装自定义主体类:

Public Class CustomPrincipal
    Inherits System.Security.Principal.GenericPrincipal

    Private _eyeColor As String
    Public ReadOnly Property EyeColor As String
        Get
            Return _eyeColor
        End Get
    End Property

    Public Sub New(id As System.Security.Principal.IIdentity, roles As String(), eyeColor As String)
        MyBase.New(id, roles)
        _eyeColor = eyeColor            
    End Sub

End Class
修改global.asax global.Application_AuthenticateRequest以使用自定义主体:

Protected Sub Application_AuthenticateRequest(ByVal sender As Object, ByVal e As System.EventArgs)
    ...
    Dim roles() As String = {"examplerole"}         
    Context.User = new CustomPrincipal(Context.User.Identity, roles, "green")
End Sub
然后,在代码的其他地方,当您希望引用这些属性之一时,请执行以下操作:

CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor

你不能指望有人能在几段时间内教会你关于.NET的所有知识。你们可以在MSDN上读到一个很好的例子,然后在Reflector中深入研究这个类及其派生——它并没有什么特别之处

角色只是应用程序/服务器中供您自己使用的名称的字符串数组

话虽如此,您实际上根本不必瞄准确切的GenericPrincipal竞争对手。退房

HttpContext.Current.Items
它是一个免费使用的哈希表,仅用于您正在服务的请求,这意味着您可以在某一点上说:

HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there);
然后,代码中的所有其他内容只需执行以下操作:

var user = HttpContext.Current.Items["TokenUser"] as MyThinUser;
你就完了

在新类中存储从身份验证代码传递到所有其他函数所需/希望传递的所有内容。保留用户属性不变(这样您就可以查看它,而不必担心您更改了某些内容)。你可以随意简化或复杂化你的系统,但你要保持完全的独立性

例如,如果您有自己的身份验证,并且只有几个访问级别,而不是枚举角色,那么您可以只携带旧的访问级别号(作为字符串携带的枚举角色无论如何都是非常低效的)


请记住,VS中的自生样本通常针对某些特定场景。因此,如果您看到用于用户管理的SQL提供程序,这并不意味着您实际上必须使用它,您仍然可以调用自己的存储过程,从SQL中自己的表中获取所需的内容。

您当前是否设置了表单身份验证和角色并正在使用?我有。我从VS2010模板中的MVC Web应用程序(与MVC空Web应用程序相反)开始,因此它包含了所有用于用户管理的默认SQL提供程序:成员资格和角色。但大部分都是在幕后完成的。通过惯例,正如它所说的那样,你能不能就这样使用配置文件支持?这就是它的用途(与用户相关联的额外数据)-应该比尝试创建“自定义用户”更简单,我认为确实如此,但我希望将它放在某种会话变量中,而不是每次都从存储中获取它。另外,除了认证cookie UserInfo(这是我正在使用的一种解决方法)之外,我还希望使用依赖注入进行测试,就像hanselman对Seth所做的那样-从哪里获得“绿色”呢?您是否在每个应用程序的AuthenticateRequest中从数据库检索它?您是否将其存储在会话变量中?@mga911-在本例中,“绿色”是硬编码的。在一个真正的web应用程序中,我会从数据库中读取它,并可能将其存储在cookie中。在对AuthenticateRequest进行其他调用时,可以从cookie中读取它以防止db调用。会话变量不是这里的选项,因为AuthenticateRequest在SessionStart之前被调用。这是一种有趣的方法。