【问题标题】:Can you wrap the RolePrincipal in a custom IPrincipal object?您可以将 RolePrincipal 包装在自定义 IPrincipal 对象中吗?
【发布时间】:2012-04-11 21:45:46
【问题描述】:

我在带有表单身份验证的 ASP.NET 框架内使用自定义成员资格和角色提供程序。这些工作得很好。角色提供者使用 cookie 来持久化角色,从而在每个 Web 请求上保存到数据库的行程。我还在 FormsAuthenticationTicket 中使用 UserData 字符串来存储 UserId。

我需要将我的 DAL 从 Web 项目中重构为自己的项目。 DAL 依赖于检索当前用户的 ID 以及检查角色的权限。 我的身份验证系统应该如何更改,以便我可以使用 Thread.CurrentPrincipal 而无需在 DAL 项目中引用 System.Web?

目前,Provider Framework 创建一个 RolePrincipal 和 FormsIdentity 对象并将其附加到 Thread.CurrentPrincipal。

我曾考虑在 Application_PostAuthenticateRequest 事件期间围绕 RolePrincipal 创建一个自定义 IPrincipal 包装器。在这种情况下,我可以从 FormsAuthenticalTicket 中获取 UserID,并将其与 RolePrincipal 一起传递给这个新的 wrapperPrincipal。

这是一种有效的方法吗?我是否会因为弄乱 Provider 结构而在项目中进一步引发一些问题?

谢谢你, 基思

protected void Application_PostAuthenticateRequest()
{
    if (Request.IsAuthenticated)
    {
        FormsIdentity identity = (FormsIdentity)User.Identity;

        if (identity != null)
        {
            FormsAuthenticationTicket ticket = identity.Ticket;

            int id = 1;

            if (identity != null)
            {
                int.TryParse(identity.Ticket.UserData, out id);
            }

            var wrapperPrincipal = new WrapperPrincipal(User, id);
            System.Threading.Thread.CurrentPrincipal = WrapperPrincipal;
        }
    }
}   



[Serializable]
public class WrapperPrincipal : IPrincipal
{        
    private IPrincipal principal;

    public WrapperPrincipal(IPrincipal principal, int userId)
    {
        this.principal = principal;
        this.Id = userId;
    }

    public int Id { get; set; }

    public IIdentity Identity
    {
        get { return principal.Identity; }
    }

    public bool IsInRole(string role)
    {
        return principal.IsInRole(role);
    }
}

【问题讨论】:

  • 我有一些疑问,我对你的问题的结果很感兴趣。如果你有任何结论,你能分享一下你的结论吗?
  • 只需使用 RolePrincipal 扩展您的 WrapperPrincipal 而不是使用 IPrincipal 并删除 IPrincipal 实现方法和属性。 RolePrincipal 实现 IPrincipal

标签: asp.net-mvc asp.net-membership wrapper iprincipal


【解决方案1】:

我最近在尝试实现自定义主体时也遇到了这个问题。我也做了包装,我认为它是有效的。它与 LukeP 在ASP.NET MVC - Set custom IIdentity or IPrincipal 中的方法完美配合。 你不能弄乱任何东西,因为它只是包装器,你只是删除原始主要成员,你甚至不碰它。我称之为聪明的解决方案。

【讨论】:

    猜你喜欢
    • 2011-08-14
    • 2010-09-17
    • 2015-09-04
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    • 2022-08-15
    • 2016-08-17
    • 1970-01-01
    相关资源
    最近更新 更多