如何在ASP.NETMVC中实现自定义主体和身份?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (38)

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

到目前为止,我已经收集到我应该实施自定义校长和/或身份认证,但我不知道如何去做。我一直在寻找关于此事的文档和教程,但我在不同的地方找到了相关的东西,我发现它有点混乱。

我已经看到了如何将自定义信息添加到用户数据属性中的身份验证cookie,但我希望从单元测试获得依赖注入的好处,这可以通过委托人和身份进行。

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

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

例如示例中的AuthenticateRequest事件中的角色魔术字符串。相反,我需要知道如何将默认SqlRoleProvider中的角色添加到当前用户:何时何地执行此操作,以及是否需要执行其他任何操作来将我的新类与其他默认提供程序连接起来。

能够访问示例ASP.NET MVC 2应用程序(例如,从Visual Studio 2010模板中),编辑并使其工作是非常棒的。

我已经编辑了这个问题,以更好地表明,我几乎迷失在这里,所以我不能做太高级别的答案。

在我看来,在身份而不是委托人中加入身份证更有意义,尽管我曾以某种方式说过。

提问于
用户回答回答于

你不能期望有人能够用几个段落教你所有你不了解.NET的东西。你可以在MSDN http://msdn.microsoft.com/en-us/library/system.security.principal.genericprincipal.aspx阅读很好的例子,并通过类挖掘,它是反射器中的衍生物 - 没有什么特别的关于它的。

角色只是您自己使用的名称的一串字符串,在您的应用/服务器中。

话虽如此,你根本不必针对确切的GenericPrincipal衍生物。查看

HttpContext.Current.Items

这是一个免费使用的哈希表,仅用于正在维护的请求 - 意味着可以在某一时刻说:

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

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

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

你就完成了。

在新类中存储您需要/想要从认证代码传递给所有其他功能的所有内容。保留用户属性完好(所以你可以偷看它,而不必担心你改变了一些东西)。Wihr你可以随意简化或复杂你的系统,但你保持完全的独立性。

例如,如果你有自己的认证,只有几个级别的访问,而不是枚举角色,你可以携带良好的旧访问级别号码(无论如何,字符串携带的枚举角色效率非常低)。

请记住,VS中的自动生成的样本通常适用于某些特定场景。所以如果你看到用于用户管理的SQL提供者并不意味着你实际上必须使用它 - 你仍然可以调用你自己的sproc来从你自己的SQL表中获得你所需要的。

用户回答回答于

使用要存储的附加特性创建自定义主体类:

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

扫码关注云+社区