2013-06-20 15 views
3

我有一個Office 365帳戶(使用最新的SharePoint 2013實例)重用ClaimsPrincipal反對的SharePoint驗證在線

我也有被認證針對Office 365的簡單的.NET Web應用程序,我創建了一個AppPrincipalId並添加它使用New-MsolServicePrincipal powershell命令。

這工作正常。我啓動應用程序(在調試中),它重定向到365登錄,我登錄,它回到了應用程序,我從ClaimsAuthenticationManager派生了一個類並覆蓋了Authenticate方法。

我現在可以看到ClaimsPrincipal,與相關權利和身份等

現在我想重新使用該標識以編程方式訪問SharePoint。

我的問題:

A)將被允許的SharePoint這身份(看到這是由sts.windows.net發行)

B)我怎樣才能重建一個有效的智威湯遜(或使用現有的),並使用身份驗證承載將其封裝在HttpRequest中。

我使用的代碼如下 - 這是回來401未經授權。

任何幫助將不勝感激。

public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
    { 
     if (incomingPrincipal != null && incomingPrincipal.Identity.IsAuthenticated == true) 
     { 

      List<Claim> claims = null; 
      claims = (from item in incomingPrincipal.Claims 
         where item.Type.StartsWith("http", StringComparison.InvariantCultureIgnoreCase) 
         select item).ToList(); 

      RNGCryptoServiceProvider cryptoProvider = new RNGCryptoServiceProvider(); 
      byte[] keyForHmacSha256 = Convert.FromBase64String("Gs8Qc/mAF5seXcGHCUY/kUNELTE="); 

      // Create our JWT from the session security token 
      JWTSecurityToken jwt = new JWTSecurityToken 
      (
       "https://sts.windows.net/myAppIdGuid/", 
       "00000003-0000-0ff1-ce00-000000000000", // sharepoint id 
       claims, 
       new SigningCredentials(
        new InMemorySymmetricSecurityKey(keyForHmacSha256), 
        "http://www.w3.org/2001/04/xmldsig-more#hmac-sha256", 
        "http://www.w3.org/2001/04/xmlenc#sha256"), 
       DateTime.UtcNow, 
       DateTime.UtcNow.AddHours(1) 
      ); 

      var validationParameters = new TokenValidationParameters() 
      { 
       AllowedAudience = "00000003-0000-0ff1-ce00-000000000000", // sharepoint id 
       ValidIssuer = "https://sts.windows.net/myAppIdGuid/", // d3cbe is my app 
       ValidateExpiration = true, 
       ValidateNotBefore = true, 
       ValidateIssuer = true, 
       ValidateSignature = true, 
       SigningToken = new BinarySecretSecurityToken(Convert.FromBase64String("mySecretKeyFromPowerShellCommand")), 
      }; 

      JWTSecurityTokenHandler jwtHandler = new JWTSecurityTokenHandler(); 
      var jwtOnWire = jwtHandler.WriteToken(jwt); 
      var claimPrincipal = jwtHandler.ValidateToken(jwtOnWire, validationParameters); 
      JWTSecurityToken parsedJwt = jwtHandler.ReadToken(jwtOnWire) as JWTSecurityToken; 

      HttpWebRequest endpointRequest = 
       (HttpWebRequest)HttpWebRequest.Create(
       "https://MySharepointOnlineUrl/_api/web/lists"); 
          endpointRequest.Method = "GET"; 
          endpointRequest.Accept = "application/json;odata=verbose"; 
          endpointRequest.Headers.Add("Authorization", 
           "Bearer " + parsedJwt.RawData); 
          HttpWebResponse endpointResponse = 
           (HttpWebResponse)endpointRequest.GetResponse(); 

     } 
    } 

回答

2

如果您的方案是關於從遠程Web應用程序使用SharePoint Online數據,則可能需要使用OAuth流。您無法自行生成令牌。相反,您要求用戶同意訪問特定範圍(資源+權限)。這兩個環節應該幫助

http://msdn.microsoft.com/en-us/library/office/apps/jj687470(v=office.15).aspx http://jomit.blogspot.com.ar/2013/03/authentication-and-authorization-with.html

+0

馬蒂亞斯 - 你指出正確的方向我!我現在有一個工作原型,非常感謝 – Phil