2016-07-12 28 views
0

我正在创建一个将使用CSOM连接到SharePoint Online的守护程序应用程序。我的应用程序将运行在互联网代理之后的企业环境中。我正在使用标准的SharePoint插件模型,并提供了使用Microsoft.IdentityModel.Extensions.dll的TokenHelper和SharePointContext类。如何强制Microsoft.IdentityModel.S2S.Protocols.OAuth2.OAuth2S2SClient.Issue使用Web代理?

我已经操纵TokenHelper在两个地方使用代理:GetRealmFromTargetUrl中的WebRequest和AcsMetadataParser中的WebClient。

但它不起作用,因为在我看来,DLL使用另一个Web请求。下面是触发异常的执行的StackTraces:

Exception Message: Token request failed. 
Stack Trace:  
    at Microsoft.IdentityModel.S2S.Protocols.OAuth2.OAuth2S2SClient.Issue(String securityTokenServiceUrl, OAuth2AccessTokenRequest oauth2Request) 
    at ScriptTask_d38d98a4cb054097ac7c2ece4802bf9a.spo.TokenHelper.GetAppOnlyAccessToken(String targetPrincipalName, String targetHost, String targetRealm) 
    at ScriptTask_d38d98a4cb054097ac7c2ece4802bf9a.ScriptMain.Main() 

Inner Exception Message: Unable to connect to the remote server 
Inner Stack Trace:  
    at System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) 
    at System.Net.HttpWebRequest.GetRequestStream() 
    at Microsoft.IdentityModel.S2S.Protocols.OAuth2.OAuth2WebRequest.GetResponse() 
    at Microsoft.IdentityModel.S2S.Protocols.OAuth2.OAuth2S2SClient.Issue(String securityTokenServiceUrl, OAuth2AccessTokenRequest oauth2Request) 

我不知道是否有解决方法?

回答

0

了解它。

而是这一呼吁的:

oauth2Response = 
    client.Issue(AcsMetadataParser.GetStsUrl(targetRealm), 
    oauth2Request) as OAuth2AccessTokenResponse; 

我创建了一个静态方法IssueToken并用下面的代码的虚拟“映射”类:

private static OAuth2AccessTokenResponse IssueToken(string sts, OAuth2AccessTokenRequest oauth2Request) { 
    string requestString = "grant_type=" + System.Web.HttpUtility.UrlEncode(oauth2Request.GrantType) + 
          "&client_id=" + System.Web.HttpUtility.UrlEncode(oauth2Request.ClientId) + 
          "&client_secret=" + System.Web.HttpUtility.UrlEncode(oauth2Request.ClientSecret) + 
          "&resource=" + System.Web.HttpUtility.UrlEncode(oauth2Request.Resource); 

    string tokenResponse; 

    byte[] byteArray = Encoding.UTF8.GetBytes(requestString); 

    WebRequest request = WebRequest.Create(sts); 
    request.Proxy = new System.Net.WebProxy { Address = new Uri(InternetProxy) }; 
    request.Method = "POST"; 
    request.ContentType = "application/x-www-form-urlencoded"; 

    request.ContentLength = byteArray.Length; 

    using (Stream reqStream = request.GetRequestStream()) { 
     reqStream.Write(byteArray, 0, byteArray.Length); 
    } 
    using (WebResponse response = request.GetResponse()) { 
     using (Stream respStream = response.GetResponseStream()) { 
      using (StreamReader reader = new StreamReader(respStream)) { 
       tokenResponse = reader.ReadToEnd(); 
      } 
     } 
    } 

    JavaScriptSerializer jss = new JavaScriptSerializer(); 
    OAuth2AccessTokenResponseDummy dummy = jss.Deserialize<OAuth2AccessTokenResponseDummy>(tokenResponse); 

    OAuth2AccessTokenResponse oauth2Response = new OAuth2AccessTokenResponse() { 
     TokenType = dummy.token_type, 
     ExpiresIn = dummy.expires_in, 
     NotBefore = jss.Deserialize<DateTime>(@"""\/Date(" + dummy.not_before + @")\/""").ToLocalTime(), 
     ExpiresOn = jss.Deserialize<DateTime>(@"""\/Date(" + dummy.expires_on + @")\/""").ToLocalTime(), 
     Scope = dummy.resource, 
     AccessToken = dummy.access_token 
    }; 

    return oauth2Response; 
} 

private class OAuth2AccessTokenResponseDummy { 
    public string token_type { get; set; } 
    public string expires_in { get; set; } 
    public string not_before { get; set; } 
    public string expires_on { get; set; } 
    public string resource { get; set; } 
    public string access_token { get; set; } 
} 

而且我也已经添加网络代理到GetClientContextWithAccessToken的代理:

public static ClientContext GetClientContextWithAccessToken(string targetUrl, string accessToken) { 
    ClientContext clientContext = new ClientContext(targetUrl); 

    clientContext.AuthenticationMode = ClientAuthenticationMode.Anonymous; 
    clientContext.FormDigestHandlingEnabled = false; 
    clientContext.ExecutingWebRequest += 
     delegate(object oSender, WebRequestEventArgs webRequestEventArgs) { 
      webRequestEventArgs.WebRequestExecutor.RequestHeaders["Authorization"] = "Bearer " + accessToken; 
      webRequestEventArgs.WebRequestExecutor.WebRequest.Proxy = webProxy; 
     }; 

    return clientContext; 
} 
+0

什么是webProxy和InternetProxy。以及如何使用这种方法?你能否认罪?我有相同的问题 – SigarDave

+1

'var webProxy = new System.Net.WebProxy {Address = new Uri(InternetProxy)};' 和InternetProxy是您的代理的地址,例如'http://proxy.domain.com: 8080' – prot

相关问题