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


    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

    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.

    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.

    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:

    Collapse | Copy Code

    var hostWeb = Page.Request["SPHostUrl"];
    var val = TokenHelper.GetAppContextTokenRequestUrl(hostWeb, Server.UrlEncode(Request.Url.ToString()));
  • 相关阅读:
    iOS开发工具
    Runtime 自动化归档
    iOS事件拦截及应用
    NoSuchFieldError
    微信开放平台创建android应用时怎么获取应用签名
    高德地图添加marker及反地理编码获取POI
    快速创建导航栏
    Android Studio 工具栏添加常用按钮
    undefined is not an object (evaluating 'RNFetchBlob.DocumentDir')
    React-Native集成到已有项目中的总结
  • 原文地址:https://www.cnblogs.com/frankzye/p/3544681.html
Copyright © 2020-2023  润新知