3

Office 365 アカウントを持っています (最新の SharePoint 2013 インスタンスを使用)

Office 365 に対して認証する単純な .net Web アプリもあります。AppPrincipalId を作成し、New-MsolServicePrincipal powershell コマンドを使用して追加しました。

これは正しく動作します。アプリを (デバッグで) 起動し、365 ログインにリダイレクトし、ログインし、アプリに戻り、ClaimsAuthenticationManager からクラスを派生させ、Authenticate メソッドをオーバーライドしました。

関連するクレームや ID などを含む ClaimsPrincipal を確認できるようになりました。

ここで、この ID を再利用して、プログラムで SharePoint にアクセスしたいと考えています。

私の質問:

a) SharePoint はこの ID を許可しますか (それが sts.windows.net によって発行されたことを確認)

b) 有効な JWT を再構築 (または既存のものを使用) し、認証ベアラーを使用してこれを 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();

        }
    }
4

1 に答える 1

2

シナリオがリモート Web アプリからの SharePoint Online データの使用に関するものである場合は、おそらく OAuth フローを使用する必要があります。自分でトークンを生成することはできません。代わりに、特定のスコープ (リソース + アクセス許可) にアクセスするための同意をユーザーに求めます。これらの2つのリンクが役立つはずです

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

于 2013-06-23T17:17:48.140 に答える