首页 > 移动平台 > 详细

How to Get SharePoint Client Context in SharePoint Apps (Provider Hosted / SharePoint Access ) in CSOM (Client Side Object Model)

时间:2014-02-12 00:02:16      阅读:821      评论:0      收藏:0      [点我收藏+]

http://www.codeproject.com/Articles/581060/HowplustoplusGetplusSharePointplusClientplusContex

Introduction

The first step of app development is to correctly get access to SharePoint client context. I have struggled to develop a simple model to initialize the SharePoint Client context. Most of the App development includes ASP Master pages. So I need to figure out a working model for app development.

First, you need to know how SharePoint offers the contextString. contextString offers when SharePoint gets redirected from appredirect.aspx URL.

Example: https://rajee.sharepoint.com/_layouts/15/appredirect.aspx?instance_id={B0D5D768-303F-4AE7-A4D3-F94B687C6AB3

At that point, we need to capture the contextString and generate either AccessToken or RefreshToken and save it for accessing the SharePoint Client Context at a later time. Otherwise, it will result in generating the error The parameter ‘token‘ cannot be a null or empty string (This is a nasty error which drove me crazy.).

Normally AccessToken is valid for 12 hours and RefreshToken is valid for 6 months.

In my approach, I used another key which is called as CacheKey to identify the user uniquely. Therefore I use this value to maintain a cookie based on the user.

Reference: Tips and FAQs: OAuth and remote apps for SharePoint 2013

bubuko.com,布布扣

The following shows my approach to do this. If you have a master page, you need to put the code in the onInit()rather than page load.

bubuko.com,布布扣 Collapse | Copy Code

protected void Page_Load(object sender, EventArgs e)
{
   var key = Session["CashKey"];

   // sharepoint url (app hosted url)
   var hostWeb = Page.Request["SPHostUrl"];

   // Sharepoint url with app Title (app deployed sp url)
   Uri SharePointUri = new Uri(hostWeb + "/SharePointApp1/");

   // This is first time the app is running
   if (key == null)
   {
       // get the TokenString
       var contextTokenString = TokenHelper.GetContextTokenFromRequest(Page.Request);
       // Get the contexttoken by passing the token string
       var contextToken = TokenHelper.ReadAndValidateContextToken
       		(contextTokenString, Request.Url.Authority);

       //Since some browsers does not support cookie name more than 40 chars
       // Im taking first 40 chars
       var cookieName = contextToken.CacheKey.Substring(0, 40);

       //Add User specific cookie name to the Session
       Session.Add("CashKey", cookieName);

       // Get the Refresh Token
       var refreshToken = contextToken.RefreshToken;
       // Add the cookie value (refresh Token)
       Response.Cookies.Add(new HttpCookie(cookieName, refreshToken));

   }
   else
   {
       // USER already in the application,  means it is not getting redirect from the appRedirect
       // So contextstring is null 
   }
}

This is code for button click.

bubuko.com,布布扣 Collapse | Copy Code

protected void Button1_Click(object sender, EventArgs e)
{
    // sharepoint url (app hosted url)
    var hostWeb = Page.Request["SPHostUrl"];

    // Sharepoint url with app name (app deployed sp url)
    Uri SharePointUri = new Uri(hostWeb + "/SharePointApp1/");

    // Get the cookie name from the session
    var key = Session["CashKey"] as string;
    // Get the refresh token from the cookie
    var refreshToken = Request.Cookies[key].Value;

    //Get the access Token By passing refreshToken
    // 00000003-0000-0ff1-ce00-000000000000 is principal name for SP2013 it is unique
    var accessToken = TokenHelper.GetAccessToken(refreshToken,
        "00000003-0000-0ff1-ce00-000000000000",
        SharePointUri.Authority, TokenHelper.GetRealmFromTargetUrl(SharePointUri));

    // Access the Sharepoint Do your work
    using (var clientContext = TokenHelper.GetClientContextWithAccessToken
    ("https://rajee.sharepoint.com/SharepointApp1", accessToken.AccessToken))
    {
        clientContext.Load(clientContext.Web, web => web.Title);
        clientContext.ExecuteQuery();
        Response.Write(clientContext.Web.Title);
    }
}

Note: In the middle of the app, if the context is broken due to expiration or some other case you need to initialize the app from the AppRedirect, therefore you can:

bubuko.com,布布扣 Collapse | Copy Code

var hostWeb = Page.Request["SPHostUrl"];
var val = TokenHelper.GetAppContextTokenRequestUrl(hostWeb, Server.UrlEncode(Request.Url.ToString()));

How to Get SharePoint Client Context in SharePoint Apps (Provider Hosted / SharePoint Access ) in CSOM (Client Side Object Model)

原文:http://www.cnblogs.com/frankzye/p/3544681.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!