SharePoint 추가 기능 (SharePoint Online)을 개발했으며 Azure에서 호스팅됩니다. 추가 기능은 ASP.NET MVC 응용 프로그램입니다.SharePointContextFilter 특성이 SharePoint 컨텍스트를 다시 작성하지 못함
/홈/색인 :
여기 상황의 사용자는 응용 프로그램의 방문 페이지에 시작 섹션
Actions
로 이동합니다.작업/인덱스 :이 페이지에서, 사용자는 몇 가지 매개 변수를 선택하고
작업을 편집 할 작업을 선택해야/편집/123는 : 편집 페이지가 열립니다 폼이다 모든 컨트롤이 작업에 대한 정보로 채워져 표시됩니다.
POST : 일부 필드 또는 없음을 변경 한 후, 사용자는 저장 버튼을 클릭합니다.
SPHostUrl
,
SPAppWebUrl
,
SPLanguage
,
SPClientTag
&
SPProductNumber
매개 변수가 있습니다.
이 모든 사용자가 시간 (분)에 대한 응용 프로그램/페이지와 상호 작용하지 않고 다음가 저장 버튼을 누를 때를 제외하고 잘 작동합니다. 단추를 누르면 응용 프로그램이 SharePointContextFilter
특성을 전달하지 못합니다. SharePointContext가 더 이상 존재하지 않습니다.
SharePointContext spContext = LoadSharePointContext(httpContext);
일반적으로는 존재하지 않거나 유효하지 않은 경우, 코드가 시도하고이 요청에 따라 기반으로 만든 것입니다 라인을 따르는 것은 널 반환합니다.
public static string GetContextTokenFromRequest(HttpRequestBase request)
{
string[] paramNames = { "AppContext", "AppContextToken", "AccessToken", "SPAppToken" };
foreach (string paramName in paramNames)
{
if (!string.IsNullOrEmpty(request.Form[paramName]))
{
return request.Form[paramName];
}
if (!string.IsNullOrEmpty(request.QueryString[paramName]))
{
return request.QueryString[paramName];
}
}
return null;
}
그래서이 실패 할 경우, 컨텍스트의 생성 및 저장이 실패하고, :
string contextTokenString = TokenHelper.GetContextTokenFromRequest(httpRequest);
이 메소드의 코드는 다음 CreateSharePointContext
방법에서, contextTokenString
항상 널입니다 앱이 기본 오류 페이지를 반환합니다.
이 컨트롤러를 호출하게 jQuery 코드입니다 : 여기
var request = $.ajax({
url: '@Url.Action("Edit", "Actions")' + window.buildSpAppParameters(),
data: $("#updateForm").serialize(),
cache: false,
type: "POST"
});
는 buildSpAppParameters
함수의 코드입니다 :
function buildSpAppParameters() {
var spHostUrl = getQueryStringParameter("SPHostUrl");
var appWebUrl = getQueryStringParameter("SPAppWebUrl");
var spLanguage = getQueryStringParameter("SPLanguage");
var spClientTag = getQueryStringParameter("SPClientTag");
var spProductNr = getQueryStringParameter("SPProductNumber");
return "?SPHostUrl=" + spHostUrl +
"&SPAppWebUrl=" + appWebUrl +
"&SPLanguage=" + spLanguage +
"&SPClientTag=" + spClientTag +
"&SPProductNumber=" + spProductNr;
}
가 왜 처음에 작동 않지만, 사용자가 대기하는 경우 일정 기간 동안 코드가 컨텍스트를 다시 만들거나 만들 수 없습니까? 실종 된 것이 있습니까? 어떻게 해결할 수 있습니까?
참고 : 다음 질문은 알고 있습니다 : Sharepoint 2013 MVC 5 provider-hosted app. Fails to authenticate on HttpPost using [SharePointContextFilter] 읽고 유용한 정보가 있지만 그다지 도움이되지 않습니다.
내 상황에 대한 일부 수정 사항과 함께 귀하의 쿠키 제안을 구현했습니다. 내가 궁금해하는 유일한 것 : 충분히 안전할까요? – Abbas
토큰을 암호화하고 암호화 된 토큰을 쿠키로 보낼 수 있습니다. 암호화 된 토큰을 다시 얻은 후에는 서버 측에서 해독 할 수 있습니다. 세션 만료 시간을 연장하여이 문제를 해결할 수도 있습니다. 세션을 Azure SQL 또는 Azure Redis Cache에 저장하고 필요에 맞게 Session의 만료 시간을 구성 할 수 있습니다. – Amor
결국 세션의 TimeOut 속성을 확장하여 문제를 해결했습니다. 나는 그것이 문제를 이해하는데 도움이되었으므로 당신의 대답을 명심해야 할 것입니다. 다시 한번 감사드립니다. – Abbas