从WebMethod中获取Sitecore用户?

从WebMethod中获取Sitecore用户?,sitecore,Sitecore,我想使一些Sitecore数据可用于非Sitecore页面。数据将由JQuery请求,并应为JSON格式。我们还需要更新项目、执行工作流操作等 我们在Sitecore 6.4上,所以据我所知,我们没有可用的ItemWebAPI或MVC选项。NET是第4版 我们尝试使用GET请求,查看查询字符串参数并分支到一个或另一个函数。一个问题是,查询字符串的默认最大大小对于我们正在传递的数据来说太小了,将其设置为允许的最大值(这显然违反了安全最佳实践)也不够可靠。因此,出于这个原因,以及一些与缓存相关的问题

我想使一些Sitecore数据可用于非Sitecore页面。数据将由JQuery请求,并应为JSON格式。我们还需要更新项目、执行工作流操作等

我们在Sitecore 6.4上,所以据我所知,我们没有可用的ItemWebAPI或MVC选项。NET是第4版

我们尝试使用GET请求,查看查询字符串参数并分支到一个或另一个函数。一个问题是,查询字符串的默认最大大小对于我们正在传递的数据来说太小了,将其设置为允许的最大值(这显然违反了安全最佳实践)也不够可靠。因此,出于这个原因,以及一些与缓存相关的问题,我们开始发布。JQuery似乎无法按照页面希望的方式发送POST数据,因此我们必须引入一些代码来解析请求负载文本(即,我们无法使用request.Form[“something”])。我们确实做到了,但它很难看。在这和分支之间是一个纠结

我现在正在研究WebMethods。除了简化代码之外,WebMethods还为我们提供了一些免费的东西,比如json格式的错误消息、缺少参数的合理错误消息等等

我设置了一个测试页面来发出请求(只是HTML和JQuery),还有一个ASPX页面来执行WebMethods。我将WebMethods页面的URL放在web.config的IgnoreUrlPrefixes中,如下所述:。我可以使用
Sitecore.Configuration.Factory.GetDatabase(databasename)
访问Sitecore数据库

因此,总体而言,WebMethods似乎比以前更好地编码和工作。现在我可以阅读代码了,我只是在编写能够工作的函数,而不是花大部分时间去弄清楚为什么事情不能工作,并实施变通方法

但我们确实丢失了Sitecore上下文,如对引用问题的回答中所述。我无法找到获取Sitecore用户的方法

我可以在Chrome开发者工具中看到,当我发出请求时,有一个sitecore\u用户票证cookie与请求一起发出。我已尝试将该cookie的值(以及
Sitecore.Web.Authentication.TicketManager.GetCurrentTicketId
的结果)输入到
Sitecore.Web.Authentication.Ticket.Parse
,但我得到了一个分析错误。有没有一种方法可以使用cookie来获取用户

或者有没有办法从ASP.NET_会话ID cookie获取用户

如果这两种方法都不可行,那么管理登录信息的好方法是什么?我知道我可以通过编程方式登录用户,但不希望在浏览器中跟踪Sitecore用户名和密码,并在每次请求时发送它们


在Sitecore之外,我对.NET没有太多的经验。

目前,您将.NET放在一个普通的aspx页面上,而不是这样做。在sitecore中创建一个新项目,理想情况下应该位于内容树的某个奇怪位置,如

/sitecore/content/home/services/handler
在上面的路径中,服务只是一个文件夹,处理程序只是另一个项目(可以基于示例模板)。对它应用一个布局,该布局在一个aspx页面(这里是您的代码)中,您可以在其中放置webmethods。。 这样,它将成为Sitecore请求,如果登录,它将具有Sitecore上下文和上下文用户(否则为匿名用户),并且您也不需要从工厂获取上下文数据库。。 为了确保安全,您可以使用基于Sitecore的身份验证或任何您喜欢的身份验证。 例如: 在第页上,请确保请求已通过身份验证,否则将重定向到所需页面

protected override void OnInit(System.EventArgs arguments)
        {
            Assert.ArgumentNotNull(arguments, "arguments");
            checkSecurity(true);
            base.OnInit(arguments);
        }
第二个是在页面加载时确定函数并调用它

protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (Request.QueryString != null && Request.QueryString.Count > 0)
                {
                       string jobName = Request.QueryString["jobName"].ToString();
                       string cacheName = Request.QueryString["cacheName"].ToString();
                       StringBuilder sbAjax = null;
                    if (jobName!=null && jobName.Length > 0)
                    {
                             if (jobName="")
                        {
                           sbAjax=callSomething();
                        this.Page.Response.Clear();
                        if (sbAjax != null)
                            this.Page.Response.Write(sbAjax.ToString());
                        else
                            this.Page.Response.Write("");
                            this.Page.Response.End();
                        }
                     }
                }
           }
}
private StringBuilder callSomething()
{
//Do Something
}

在重新阅读评论()中提到的问题@Gabber之后,我有一个可行的解决方案。简而言之,我可以根据基本的
System.Web.Security.MembershipUser
对用户进行身份验证,这是在创建Sitecore帐户时设置的。访问者可以使用其Sitecore用户名和密码。然后,我可以使用
System.Web.Security.FormsAuthCookie.SetAuthCookie
设置AuthCookie,每当我需要Sitecore用户时,我都可以从
HttpContext.Current.Request.Cookie[FormsAuthentication.FormsCookieName]获取域和用户名
并将其馈送到
Sitecore.Security.Accounts.User.FromName
以返回Sitecore用户

有一点不太好,那就是如果用户已经登录到Sitecore,他们将不得不再次进行身份验证以设置MembershipUser的cookie(即,我没有为当前登录的Sitecore用户获取Sitecore身份验证)。我想这对我来说是可以的。大多数访问WebMethod fed普通html页面的人无论如何都不会是CMS用户。但是,对于那些正在登录的用户来说,避免再次登录将是一件好事

[WebMethod]
public static bool login(string user, string password, string domain)
{
    bool valid = System.Web.Security.Membership.ValidateUser(domain + "\\" + user, password);
    if (valid)
    {
        System.Web.Security.FormsAuthentication.SetAuthCookie(domain + "\\" + user, true);
        return true;
    }
    return false;
}

[WebMethod]
public static string getuser()
{
    HttpCookie authCookie = HttpContext.Current.Request.Cookies[FormsAuthentication.FormsCookieName];
    FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt(authCookie.Value);
    string u = ticket.Name;

    Dictionary<string, string> responseDict = new Dictionary<string, string>(); 

    User user = Sitecore.Security.Accounts.User.FromName(u,false);
    {
        responseDict["domain"] = user.Domain.Name;
        responseDict["user"] = user.Name;
        responseDict["displayname"] = user.DisplayName;
        responseDict["email"] = user.Profile.Email;
        responseDict["fullname"] = user.Profile.FullName;                
    }

    return JsonConvert.SerializeObject(responseDict, Formatting.Indented);
}
[WebMethod]
公共静态bool登录(字符串用户、字符串密码、字符串域)
{
bool valid=System.Web.Security.Membership.ValidateUser(域+“\\”+用户,密码);
如果(有效)
{
System.Web.Security.FormsAuthentication.SetAuthCookie(域+“\\”+用户,true);
返回true;
}
返回false;
}
[网络方法]
公共静态字符串getuser()
{
HttpCookie authCookie=HttpContext.Current.Request.Cookie[FormsAuthentication.FormScookeName];
FormsAuthenticationTicket票证=FormsAuthentication.Decrypt(authCookie.Value);
字符串u=票证名称;
Dictionary responseDict=新字典();
User User=Sitecore.Security.Accounts.User.FromName(u,false);
{
responseDict[“domain”]=user.domain.Name;
responseDict[“user”]=user.Name;
responseDict[“displayname”]=user.displayname;
ResponseDect[“email”]=user.Profile.email;
responseDict[“fullname”]=user.Profile.fullname;
}
返回JsonConvert.SerializedObject(responseDect,Formatting.Indented);
}
下面是我用来测试这些WebMet的普通html页面
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
</head>
<body>

    <p>domain <input type="text" name="domain" id="domain"/></p>
    <p>user <input type="text" name="user" id="user"/></p>
    <p>password<input type="text" name="password" id="password"/></p>
    <div class="gettoken button">
        <p>Get Token</p>
    </div>
    <p class="tokenresult">token result</p>

    <hr/>

    <div class="getuserinfo button">
        <p>Get User Info</p>
    </div>
    <p class="userresult">result</p>

    <hr/>

    <script>
    $('div.gettoken').click(function ()
    {
        var user = $('#user').val();
        var domain = $('#domain').val();
        var password = $('#password').val();

        $.ajax({
            type: "POST",
            url: "http://sitecore/apis/scitemapi.aspx/setauthcookie",
            data: '{"domain":"' + domain + '", "user": "' + user + '", "password":"' + password + '"}',
            contentType: "application/json; charset=utf-8",
            success: function (msg)
            {
                $("p.tokenresult").text(msg.d);
            }
        });
    });

    $('div.getuserinfo').click(function ()
    {
        $.ajax({
            type: "POST",
            url: "http://sitecore/apis/scitemapi.aspx/getuser",
            data: '{}',
            contentType: "application/json; charset=utf-8",
            success: function (msg2)
            {
                $("p.userresult").text(msg2.d);
            }
        });
    });


    </script>
    <style>

    html{
        font-family:tahoma;
        }

    .button{
        background-color:blue;
        color:white;
        border:1px solid black;
        border-radius:4px;  
        width:12em;
        text-align:center;
        margin-top:1em;
        padding:.5em;
        }

    </style>
</html>