如何在ASP.NET MVC中实现自定义Principal和Identity?

时间:2010-07-18 01:08:52

标签: asp.net-mvc-2 forms-authentication identity principal

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

到目前为止,我已经收集到了我应该寻求实现自定义Principal和/或Identity,但我不确定如何去实现它。我一直在寻找关于这个问题的文档和教程,但我在不同的地方找到了相关的东西,我发现它有点令人困惑。

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

如果我想实现自己的Principal或Identity,我需要考虑哪些 确切的 步骤?

在这种情况下我能做的最简单的事情是什么(只需添加ID并保留所有默认值)? “默认值”将包括默认提供者(成员资格,角色等)。

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

能够访问示例ASP.NET MVC 2应用程序(例如,来自visual studio 2010模板)非常棒,进行编辑并使其正常工作。


编辑:我已经编辑了这个问题,以便更好地表明我在这里 丢失 ,所以我无法做到答案太高了。

P.S。:在我看来,在身份而不是校长中使用ID会更有意义,尽管我在某种程度上已经说明了这一点。

2 个答案:

答案 0 :(得分:20)

之前已经提出并回答过这个问题: ASP.NET MVC - Set custom IIdentity or IPrincipal

但总结一下......

使用您想要存储的其他属性来创建自定义主体类:

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

答案 1 :(得分:2)

你不能期望有人可以在几段内教你关于.NET的所有知识。您可以在MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx上阅读相当不错的示例并深入研究类及其在Reflector中的衍生物 - 它没有什么特别之处。

角色只是您自己使用的名称的字符串,在您的app / server中。

话虽如此,你根本不必瞄准精确的GenericPrincipal derrivative。看看

HttpContext.Current.Items

这是一个免费使用的Hashtable,仅用于您正在服务的请求 - 这意味着您可以说:

HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there);

然后代码中的其他任何地方都会这样做:

var user = HttpContext.Current.Items["TokenUser"] as MyThinUser;

你已经完成了。

在新课程中存储您需要/想要从身份验证代码传递到所有其他功能的所有内容。保持用户属性不变(所以你可以窥视它而不必担心你改变了什么)。您可以随意简化或复杂化系统,但保持完全独立。

例如,如果您有自己的身份验证,只有几个级别的访问而不是枚举角色,那么您可以携带良好的旧访问级别编号(因为字符串带来的枚举角色效率非常低)。

请记住,VS中的自动样本通常适用于某些特定情况。因此,如果您看到用户管理的SQL提供程序并不意味着您实际上必须使用它 - 您仍然可以调用自己的sproc来从SQL中获取所需的内容。