我正在尝试为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
}
答案 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 真
所以它应该有效。 干杯 延