2015-02-23 62 views
0

我想讓一些Sitecore數據可用於非Sitecore頁面。數據將由JQuery請求,並且應該採用JSON格式。我們也將需要更新的項目,執行工作流操作等從WebMethod內部獲取Sitecore用戶?

我們對Sitecore的6.4左右,據我所知,我們沒有ItemWebAPI或MVC作爲選件提供。 .NET是版本4

我們試圖用GET請求做,看着查詢字符串參數並分支到一個或另一個函數。一個問題是,查詢字符串的默認最大大小對於我們傳遞的數據來說太小了,並且將其設置爲允許的最大值(這顯然違反了安全最佳實踐)也不夠可靠。因此,出於這個原因和一些緩存相關的問題,我們轉移到POST。 JQuery似乎無法以頁面想要的方式發送POST數據,所以我們不得不引入一些代碼來解析請求有效載荷文本(即我們不能使用Request.Form [「something」])。我們確實得到了這個工作,但它很醜陋。在那和分支之間它是一個糾結。

我現在正在看WebMethods。除了簡化代碼外,WebMethods還爲我們提供了一些免費的東西,比如json格式的錯誤消息,缺少參數的敏感錯誤消息等。

我有一個測試頁面用於設置請求(只是HTML和JQuery)和一個ASPX頁面來完成WebMethods。我將WebMethods頁面的URL放在web.config的IgnoreUrlPrefixes中,如下所述:WebMethod not accessible in Sitecore。我可以使用Sitecore.Configuration.Factory.GetDatabase(databasename)訪問Sitecore數據庫。

所以整體的WebMethods似乎是更好的代碼和工作比我們以前爲好。現在我可以閱讀代碼,我只是編寫可以工作的函數,而不用花費大部分時間來弄清楚爲什麼事情不能正常工作和實施解決方法。

但我們確實失去了Sitecore的背景下,作爲在回答說明所引用的問題。我一直無法找到獲得Sitecore用戶的方法。

我可以在Chrome開發者工具看,當我提出一個要求,有一個sitecore_userticket的cookie請求外出。我嘗試將該cookie的值(以及Sitecore.Web.Authentication.TicketManager.GetCurrentTicketId的結果)提供給Sitecore.Web.Authentication.Ticket.Parse,但我得到一個分析錯誤。有沒有辦法使用該cookie來獲取用戶?

或者有沒有辦法讓用戶從ASP.NET_SessionId cookie?

如果沒有這些都是可行的,什麼是管理的登錄信息的好辦法?我知道我可以以編程方式登錄用戶,但不希望在瀏覽器中跟蹤Sitecore用戶名和密碼,並向他們發送每個請求。

我對Sitecore以外的.NET沒有太多經驗。

+1

也許這可以幫助 - http://stackoverflow.com/questions/4783556/display-original-sitecore- username-instead-whats-currently-typed-in – Gabbar 2015-02-23 21:16:52

+0

請提供一些代碼,以便處理您的票證,並提供錯誤詳情 – 2015-02-25 08:47:19

回答

0

我之後重新閱讀評論(Display original Sitecore username instead of what's currently typed in)@Gabber提到的問題一個可行的解決方案。簡而言之,我可以根據在創建Sitecore帳戶時設置的底層System.Web.Security.MembershipUser進行身份驗證。訪問者可以使用他或她的Sitecore用戶名和密碼。然後,我可以設置一個帶有System.Web.Security.FormsAuthentication.SetAuthCookie的AuthCookie,並且每當我需要Sitecore用戶時,我都可以從HttpContext.Current.Request.Cookies[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); 
} 

這裏是我使用來測試這些Web方法純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> 
0

目前,你把一個正常的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 
} 
+0

這是我採用的第一條路線,但我無法完成工作。看起來,如果您不告訴Sitecore不處理請求(通過將其包含在web.config中的'IgnoreUrlPrefixes'設置中),WebMethods將不會運行.../sitecore/content/home/services的請求/ handler/mymethodname會返回一個沒有json有效載荷的完整頁面,就像/ sitecore/content/home/services/handler一樣。 – fwkb 2015-02-25 15:26:19

+0

如果您的議程是「數據將由JQuery請求,並且應該採用JSON格式,我們還需要更新項目,執行工作流程操作等。」比使用簡單的查詢字符串方式(GET請求)或傳遞參數到頁面(使用POSTBACK),我不會做任何Web方法,並根據收到的頁面加載參數決定執行哪個函數,而輸出I將確保清除頁面響應,將所需的輸出寫爲可能是JSON的字符串,然後結束響應。我可以分享樣本。 – Vishu 2015-02-26 13:52:41

+0

我們確實嘗試過類似於您的建議。我會用以前的一些工作更多的信息來更新這個問題。 – fwkb 2015-02-26 16:14:48