在sitecore中裸露的MembershipProvider

时间:2011-08-23 10:37:24

标签: asp.net-membership sitecore membership-provider

我正在尝试为sitecore实现一个非常简单的MembershipProvider,但我不确定它是否太简单实际工作。基本上我们已经有一个用户数据的自定义商店,所以我知道客户MembershipProvider是可行的方法。但是我的应用程序不会记录任何人,系统的不同部分负责。此外,它并不关心究竟是谁登录,只关注他们是否是(我的网站内容区域中的哪个部分无关紧要)。

那么最好的方法是什么?我在HTTP标头中传递了一个令牌,它允许我识别是否有人登录(我甚至可以使用它来实际找出客户是谁,如果我愿意) - 不要担心它是加密的。

我已经阅读了sitecore文档,但它们都处理MembershipProvider的完整实现。

那么实际上是否有可能只有这样的成员资格提供者,即返回用户表示被记录,或者返回那些已注销的“匿名”用户?它不需要关心其他任何事情 - 密码重置,通过电子邮件和所有爵士乐查找用户。

谢谢, 尼克

编辑:在Jens的帮助下,我避开了一个全面的MembershipProvider,转而采用更轻量级的方法。

这就是我到目前为止所遇到的问题,即用户不会通过多个请求保持登录状态。

public class TokenLogin : HttpRequestProcessor
{


    #region Overrides of HttpRequestProcessor

    /// <summary>
    /// Processes the specified args.
    /// </summary>
    /// <param name="args">The args.</param>
    public override void Process(HttpRequestArgs args)
    {
        var customer = SomeCodeToParseAndValidateToken();

        //customer is null if token is invalid or missing
        if(customer == null || Sitecore.Context.User.IsAuthenticated) return;

        CreateVirtualUser(customer);
    }

    private static void CreateVirtualUser(CustomerAccount customer)
    {
        string userName = "extranet\\" + customer.CustomerAccountId;

        User userItem = AuthenticationManager.BuildVirtualUser(userName, true);   
        userItem.Profile.Initialize(userName, true);    
        userItem.Profile.Save();

        AuthenticationManager.Login(userItem.Name);
    }

    #endregion
}

1 个答案:

答案 0 :(得分:8)

实现membershipprovider是你需要的很多工作。如果我是你,我会实现一个场景,每当有人需要登录时你就会创建一个虚拟用户。 因此,逻辑是检查用户是否拥有您的令牌,然后创建虚拟用户,记录虚拟用户,您应该好好去。

以下是有关虚假用户资料的指南:http://sdn.sitecore.net/Articles/Security/Faking%20user%20roles/Virtual%20user.aspx

编辑:链接中的代码已被删除。以下是添加虚拟用户的方法:

   userName = "extranet\\"+userName    
   User userItem = AuthenticationManager.BuildVirtualUser(userName, true);   
   userItem.Profile.Initialize(userName, true);    
   userItem.Profile.Email = userName + "@yourdomain.com";   
   userItem.Profile.Save();

   AuthenticationManager.Login(userItem.Name)

编辑2:我有以下代码:

    public class TestVirtualUserProcessor : HttpRequestProcessor
    {


      public override void Process(HttpRequestArgs args)
      {
        HttpContext.Current.Response.Write(Sitecore.Context.User.Name + "<br/>");
        HttpContext.Current.Response.Write(Sitecore.Context.User.IsAuthenticated + "<br/>");

        CreateVirtualUser("jenneren");

        HttpContext.Current.Response.Write(Sitecore.Context.User.Name + "<br/>");
        HttpContext.Current.Response.Write(Sitecore.Context.User.IsAuthenticated + "<br/>");
        }

      private static void CreateVirtualUser(string name)
      {
        string userName = "extranet\\" + name;

        User userItem = AuthenticationManager.BuildVirtualUser(userName, true);
        userItem.Profile.Initialize(userName, true);
        userItem.Profile.Save();

        AuthenticationManager.Login(userItem.Name);
      }


    }

第一次点击前端时输出以下内容:

外联网\匿名 假 外网\ jenneren 真

我第二次到达前端时:

外联网\ jenneren 真正 外网\ jenneren 真

所以它应该有效。 干杯 延