문제

나는 수정하는 기존의 시스템 SharePoint2013 를 사용하는 형태와 기반 인증(필)사용자가 허용하는 셀프 서비스 계정 생성 및 관리하의 계정이다.는 것들 중 하나를 관리할 수 있는 것은 역할 membership;을 효과적으로,그들은 주어진 역할에 액세스 코드는 그 공급하는 시스템,그리고 그것에 추가하는 역할을 수 있도록 사이트를 액세스하는 역할을 부여되었습니다.솔루션의 일부 사용자 지정 로그인하는 화면을 지원하는 데 도움이의 모든 이것과 더 많은 사용자 친화적이다.이 모든 작업이 상대적으로습니다.

작업 난 그것에 노력하고 추가 지원에 대한 외부 인증 업체보다 형성 기반 인증-비즈니스 요구 사항입니다.의 많음이있다 온라인으로 정보를(e.g. http://blogs.msdn.com/b/mvpawardprogram/archive/2011/06/17/mvps-for-sharepoint-2010-using-azure-acs-v2-to-authenticate-external-systems-users.aspx)를 추가하는 방법에 대 Azure ACS id 공급자로 그의 작동합니다.문제입니다 지금 어떻게 추가 자기 서비스 역할 권한 조각입니다.

했더니 간단한 클레임을 확대로 작동하면 다음에서 가이드 http://www.microsoft.com/en-us/download/details.aspx?id=27569.문제는 나를 치는"일반적인"문제에 상자 STS 을 캐싱에서,그래서 때 사용자의 역할 회원이 변경되면,그들은 오래된 캐시 토큰다.나의 주장을 증가 코드를 호출하지 않습니다(물론 아는 것이 왜 때 STS 를 사용하여 캐시권)를 사용하기 때문에 변경하에서 회원되지 않을 볼 수 있습니다.

이것은 거의 동일한 종류의 문제에서 설명 권한 확인을 보여주는 잘못 된 정보http://www.shillier.com/archive/2010/10/25/authorization-failures-with-claims-based-authentication-in-sharepoint-2010.aspx, 으로,일반적인 응답을 변경하는 토큰 수명 주어집니다.나는 몇 가지 문제와 그 이유............

  1. 외부에서 청구 시나리오를,무엇입 수명 적용됩니까?그것은 Windows 토큰,그리고 그것은 필 토큰,그래서 어느 쪽도 WindowsTokenLifetimeFormsTokenLifetime 이 적절하다,하지만 사람들은 두 사람들이 말하는 변화입니다.

  2. 나는 원하지 않는 토큰을 만료되는 최종 사용자 사용에 불합리하게 짧은 시간에,나는 그냥 STS 만료는 저장된 버전이나 이상적으로 결코 그것을 캐시 모두에서(내가 알고 있는 성능 문제가-I don't care,우리의 규모가 그것이 문제가되지 않습니다).그것 같다는 그 두 가지와 결합니다,하지만.는 방법이 있을 분리하려면을까?

  3. 할 수 없을 경우에는 분리하는 방법이 있 로그인에 대한 화면을 표시하는 시스템이 내가 원하는 주장을 다시 증?할 수 있습니 그냥을 자신은 그것을 수정하여 현재 사용자 id?는 시스템의 뒤로 물론 그래서 나는 원하지 않는 경우가 도움이 될 수 있습니다.

  4. 이 모든 것을 궁극적으로 내려와 캐싱에락 과정에서 숨겨져 STS 이후의 다른 모든 움직이는 부품을 것 같습니다.은"오른쪽"이 문제를 방지 할 수있는 방법을 만드는 사용자 정의 STS 없는 캐싱 행동으로 등록 id 공급자?(가 있는 경우 사용자 지정 STS 것 같아 내 성가시게 하지 않을 것으로 주장을 증가 시점에서,나는 단지 문제에 모두 적절한 클레임에서 첫 번째 장소입니다.) 는 것 같아 상당한 양의 작업만(지만 내가 알고 있는 샘플을 포함하여 http://archive.msdn.microsoft.com/SelfSTS),특히 때문에 그것을 것 같아 나는 연결해야 신뢰 당사자에 연결하 Azure ACS 다음의 일부로서 프로세스로 된 대역 외 STS 는"마술"몇 줄의 PowerShell 과 노력이 소요됩니다.

  5. 또는,당해 클레임을 포기하고 단순히 변경할 필 측?는 느낌과 같은 끔찍한 방법으로 이동하기 때문 지금 내가 필요로 연결하는 모든 OpenID 에 인증 코드에 대한 응용 프로그램,그리고 난 뒤로 이동하텔에서 청구할 때 나는 내가 이동해야한다려 주장하고있다.

지연의 말 60 분 단순히 수락가능하지 않을 때에는 필 모델을 만들 수 있는 변경에 의해 즉시 강제로 로그인하도록 사용자에게 다시 얻을 수있는,새로운 역할은 회원입니다.

도움이 되었습니까?

해결책

좋아,내가 가지고 이 작업(yay!), 그러나 사람,그것은 힘든 것입니다.

기본적으로,당신은 필요를 강제로 토큰을 다시서 발급한 STS,는 클레임을 확대하는 코드를 다시 실행합니다.내 경우에는,비즈니스 요구 사항들보다 조금 더 복잡기 때문에,나는 데 필요한 실제로는 단 하나의 주장이 가능하지만,그 밖에서 즉각적인 범위의 이 질문입니다.

기본적으로 갔다가 해제 코드에서 언급한 https://stackoverflow.com/questions/8070456/re-calculate-claims-for-sharepoint-2010-user-while-the-user-is-still-logged-in/8185646#8185646 .하나는 일은 내가 할 수 있었던 제거 e.ReissueCookie 그 이후로 완전히 파산에 대한 인증을 나(사용자가 로그아웃 해당 액션).내 경우에는,내가 하고 싶지 않았던 그를 통해 특별 페이지를,그래서 내가 사용하는 사용자가 특정 값은 응용 프로그램에서 컬렉션에는 즉시 취소한 후에 행동니다.관련 코드에 이벤트는 수신기를 추가하고 제거에서 코드 global.asax 다음과 같:

        private readonly string AsaxText = @"
<%@ Assembly Name=""" + System.Reflection.Assembly.GetAssembly(typeof(ClaimSupport)).FullName + @"""%>
<script runat='server'> 
    void SessionAuthentication_SessionSecurityTokenReceived(object sender, Microsoft.IdentityModel.Web.SessionSecurityTokenReceivedEventArgs e) { 
        var application = HttpContext.Current.Application;
        if (application == null) {
            return;
        }
        var key = Company.SharePoint.Authentication.Data.ClaimSupport.ApplicationEventKey(e.SessionToken.ClaimsPrincipal.Identity.Name);
        var applicationValue = application[key];
        if (applicationValue == null) { 
            return;
        }
        var applicationString = applicationValue.ToString();
        if (string.IsNullOrWhiteSpace(applicationString)) {
            return;
        }
        application[key] = null;
        var sam = sender as Microsoft.IdentityModel.Web.SessionAuthenticationModule; 
        var logonWindow = Microsoft.SharePoint.Administration.Claims.SPSecurityTokenServiceManager.Local.LogonTokenCacheExpirationWindow; 
        var newValidTo = System.DateTime.UtcNow.Add(logonWindow);
        var currentPrincipal = e.SessionToken.ClaimsPrincipal;
        var claimsIdentity = (Microsoft.IdentityModel.Claims.IClaimsIdentity)currentPrincipal.Identity;

        var heartbeatClaim = GetHeartbeatClaim(claimsIdentity);
        var issuer = heartbeatClaim.Issuer;
        var originalIssuer = heartbeatClaim.OriginalIssuer;
        RemoveExistingEventClaims(claimsIdentity);
        AddEventClaim(claimsIdentity, applicationString, issuer, originalIssuer);

        e.SessionToken = sam.CreateSessionSecurityToken( 
            currentPrincipal, 
            e.SessionToken.Context, 
            e.SessionToken.ValidFrom, 
            newValidTo, 
            e.SessionToken.IsPersistent); 
        //e.ReissueCookie = true; - commented out because it broke things for me, but kept for reference
    } 

    private Microsoft.IdentityModel.Claims.Claim GetHeartbeatClaim(Microsoft.IdentityModel.Claims.IClaimsIdentity claimsIdentity) {
        var heartbeatClaim = (from c in claimsIdentity.Claims
                              where
                                  (c.ClaimType == Company.SharePoint.Authentication.Data.ClaimSupport.EventClaimType)
                              &&
                                  (c.Value == Company.SharePoint.Authentication.Data.ClaimSupport.HeartbeatClaimValue)
                              select c).FirstOrDefault();
        return heartbeatClaim;
    }

    private void AddEventClaim(Microsoft.IdentityModel.Claims.IClaimsIdentity claimsIdentity, string additionalEvent, string issuer, string originalIssuer) {
        var eventClaim = new Microsoft.IdentityModel.Claims.Claim(Company.SharePoint.Authentication.Data.ClaimSupport.EventClaimType, additionalEvent, HynesITe.SharePoint.Authentication.Data.ClaimSupport.EventClaimValueType, issuer, originalIssuer);
        claimsIdentity.Claims.Add(eventClaim);
    }

    private static void RemoveExistingEventClaims(Microsoft.IdentityModel.Claims.IClaimsIdentity claimsIdentity) {
        var currentClaims = (from c in claimsIdentity.Claims
                             where
                                 (c.ClaimType == HynesITe.SharePoint.Authentication.Data.ClaimSupport.EventClaimType)
                             &&
                                 (c.Value != HynesITe.SharePoint.Authentication.Data.ClaimSupport.HeartbeatClaimValue)
                             select c).ToList();
        foreach (var claim in currentClaims) {
            claimsIdentity.Claims.Remove(claim);
        }
    }
</script> 
";

        private void AddGlobalAsax(SPFeatureReceiverProperties properties) {
            var webApp = properties.Feature.Parent as SPWebApplication;
            if (webApp == null) {
                throw new SPException("Cannot add global.asax entries.");
            }
            var zones = Enum.GetValues(typeof(SPUrlZone)).Cast<SPUrlZone>().ToArray();
            var paths =
                zones.Select(z => Path.Combine(webApp.GetIisSettingsWithFallback(z).Path.ToString(), "global.asax"))
                    .Distinct().Where(File.Exists).ToArray();
            var globalAsaxFiles = new List<string>();
            globalAsaxFiles.AddRange(paths);
            foreach (var asax in from asax in globalAsaxFiles
                                 let contents = File.ReadAllText(asax)
                                 where !contents.Contains(AsaxText)
                                 select asax) {
                File.AppendAllText(asax, AsaxText);
            }
        }

        private void RemoveGlobalAsax(SPFeatureReceiverProperties properties) {
            var webApp = properties.Feature.Parent as SPWebApplication;
            if (webApp == null) {
                throw new SPException("Cannot add global.asax entries.");
            }
            var zones = Enum.GetValues(typeof(SPUrlZone)).Cast<SPUrlZone>().ToArray();
            var paths =
                zones.Select(z => Path.Combine(webApp.GetIisSettingsWithFallback(z).Path.ToString(), "global.asax"))
                    .Distinct().Where(File.Exists).ToArray();
            var globalAsaxFiles = new List<string>();
            globalAsaxFiles.AddRange(paths);
            foreach (var asax in globalAsaxFiles) {
                var contents = File.ReadAllText(asax);
                if (contents.Contains(AsaxText)) {
                    var replaced = contents.Replace(AsaxText, string.Empty);
                    File.WriteAllText(asax, replaced);
                }
            }
        }

        public override void FeatureActivated(SPFeatureReceiverProperties properties) {
            // other stuff
            AddGlobalAsax(properties);
            // other stuff
        }

        public override void FeatureDeactivating(SPFeatureReceiverProperties properties) {
            // other stuff
            RemoveGlobalAsax(properties);
            // other stuff
        }

ClaimSupport 어셈블리를 보유하고 일부 기타 공유 코드:

namespace HynesITe.SharePoint.Authentication.Data {
    public static class ClaimSupport {
        public static string EventClaimType {
            get {
                return "http://schema.Company.com/events";
            }
        }

        public static string EventClaimValueType {
            get {
                return Microsoft.IdentityModel.Claims.ClaimValueTypes.String;
            }
        }

        public static string ApplicationEventKey(string username) {
            return username + ":CurrentEvent";
        }

        public static string ApplicationIssuerKey(string username) {
            return username + ":Issuer";
        }

        public static string ApplicationOriginalIssuerKey(string username) {
            return username + ":OriginalIssuer";
        }

        public static string HeartbeatClaimValue {
            get {
                return "[heartbeat]";
            }
        }
    }
}

하나는 것은 정말 중요한 것은 여기는 경우 조작하는 클레임으로,내가 여기,당신을 기다리고 그 주장에 의해 인식되 SharePoint,당신은 필요에 맞게 발급하는 정보를 SharePoint 사용하는 것으로 SPClaim 는 이유입니다,"심장 박동"이라는 문구가 붙어 있습니다.대부분의 경우에 당신을 걱정하지 않을 것이라는 점을의 모든 것-클레임을 증대시키는 사람이 옳은 일을-하지만 여기에,나는야만 하나의 가능한 클레임 집합이,그래서 내가 직접 조작하기 위해서 이 코드 대신에서 클레임 증 코드입니다.

또한 나도 알아 가져올 수 있습니다 네임스페이스 global.asax 하지만 내가 아는 한 다른 코드 또는 사용자의 조작하는 파일이다,그래서 내가 만든 변경 사항으로 독립적으로 가능합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 sharepoint.stackexchange
scroll top