Повторное использование ClaimsPrincipal для аутентификации на sharepoint онлайн
У меня есть учетная запись Office 365 (используется последний экземпляр SharePoint 2013)
У меня также есть простое веб-приложение.net, которое проходит аутентификацию в Office 365. Я создал AppPrincipalId и добавил его с помощью команды PowerShell New-MsolServicePrincipal.
Это работает правильно. Я запускаю приложение (в режиме отладки), оно перенаправляет на 365 вход в систему, я вхожу в систему, оно возвращается к приложению, и я получил класс из ClaimsAuthenticationManager и переопределил метод Authenticate.
Теперь я могу видеть ClaimsPrincipal, с соответствующими претензиями и личностью и т. Д.
Теперь я хотел бы повторно использовать эту идентификацию для программного доступа к SharePoint.
Мои вопросы:
а) Разрешит ли SharePoint эту идентификацию (учитывая, что она была выдана sts.windows.net)
б) Как я могу восстановить действительный 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();
}
}
1 ответ
Если ваш сценарий предполагает использование данных 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