我想在经过身份验证的用户中存储额外的信息,以便我可以轻松访问它(例如 User.Identity.Id),而不仅仅是名称,因为我打算拥有那个非唯一的。
到目前为止,我已经收集到我应该寻求实现自定义主体和/或身份,但我不确定如何去做。我一直在寻找有关此事的文档和教程,但我在不同的地方找到了相关的东西,我发现它有点令人困惑。
我已经看到如何将自定义信息添加到用户数据属性中的身份验证 cookie,但我希望能够从依赖注入(inject)中受益,我可以使用主体和身份来进行单元测试。
什么是准确 如果我想实现自己的 Principal 或 Identity,我需要考虑的步骤?
在这种情况下,我能做的最简单的事情是什么(只需添加 ID 并保留所有默认值)? “默认值”将包括默认提供者(成员资格、角色等)。
我看过other question ,但我会很感激不会在两者之间留下任何漏洞的答案,例如示例中 AuthenticateRequest 事件中的角色魔术字符串。相反,我需要知道如何将默认 SqlRoleProvider 中的角色添加到当前用户:何时何地执行此操作,以及是否需要执行其他任何操作来将我的新类与其他默认提供程序连接起来。
能够转到示例 ASP.NET MVC 2 应用程序(例如,来自 Visual Studio 2010 模板),进行编辑并让它工作,真是太棒了。
编辑:我已经编辑了这个问题,以更好地表明我几乎是 丢失在这里,所以我无法应付太高水平的答案。
附:在我看来,在身份中使用 ID 而不是在主体中使用 ID 更有意义,尽管我之前在某种程度上已经说明了这一点。
最佳答案
这个问题之前有人问过并回答过:
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
关于asp.net-mvc-2 - 如何在 ASP.NET MVC 中实现自定义主体和身份?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3273925/