首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在ASP.NET MVC中实现自定义的主体和标识?

如何在ASP.NET MVC中实现自定义的主体和标识?
EN

Stack Overflow用户
提问于 2010-07-18 09:08:52
回答 2查看 22.2K关注 0票数 16

我希望在经过身份验证的用户中存储额外的信息,这样我就可以轻松地访问它(例如,像User.Identity.Id ),而不仅仅是名称,因为我计划让它不是唯一的。

到目前为止,我已经了解到我应该考虑实现自定义主体和/或标识,但我不确定如何进行。我一直在寻找关于这个问题的文档和教程,但我在不同的地方找到了相关的东西,我发现它有点令人困惑。

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

如果我想实现我自己的主体或身份,我需要考虑的确切的步骤是什么?

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

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

如果能够转到一个示例ASP.NET mvc2应用程序(例如,来自visual studio 2010模板),进行编辑并使其工作,那将是非常棒的。

编辑:我编辑了这个问题,以便更好地表明我在这里很像lost,所以我不能凑合着回答太高级的问题。

附言:在我看来,将ID放在身份中比在主体中更有意义,尽管我在某种程度上已经说明过这一点。

EN

回答 2

Stack Overflow用户

发布于 2010-07-30 23:52:06

这个问题以前已经被问过并回答过了:ASP.NET MVC - Set custom IIdentity or IPrincipal

但总而言之...

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

代码语言:javascript
复制
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以使用您的自定义主体:

代码语言:javascript
复制
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

然后,在代码中的其他地方,当您想引用这些属性之一时,请执行以下操作:

代码语言:javascript
复制
CType(My.User.CurrentPrincipal, CustomPrincipal).EyeColor
票数 20
EN

Stack Overflow用户

发布于 2010-08-03 18:47:08

你不能真的期望别人能在几个段落里教你所有你不知道的关于.NET的东西。你可以在MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx上读到非常好的例子,并深入研究这个类和它在Reflector中的派生--没有什么特别的。

角色只是在你的应用程序/服务器中供你自己使用的名称的字符串阵列。

话虽如此,你实际上并不一定要瞄准确切的GenericPrincipal推导。检查

代码语言:javascript
复制
HttpContext.Current.Items

它是一个免费使用的Hashtable,仅用于您正在服务的请求-这意味着您可以在某一点上这样做:

代码语言:javascript
复制
HttpContext.Current.Items["TokenUser"] = new MyThinUser(anything,I,want,there);

然后代码中的所有其他部分都会这样做:

代码语言:javascript
复制
var user = HttpContext.Current.Items["TokenUser"] as MyThinUser;

你就完了。

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3273925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档