<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Random SharePoint Problems Explained; Intermittently</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/spjr/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/spjr/feed.xml</link>
    <description>10-plus years in SharePoint support.  I’ve seen things… By: Sr SEE Josh Roark</description>
    <lastBuildDate>Mon, 31 Dec 2018 22:31:22 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>This content is moving…</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/this-content-is-moving</link>
      <pubDate>Mon, 31 Dec 2018 17:30:48 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=4435</guid>
      <description><![CDATA[Thanks for visiting.

 I've decided to move all of this content to my own site:...]]></description>
      <content:encoded><![CDATA[<p>
 </p><p>Thanks for visiting.
</p><p>
 </p><p>I've decided to move all of this content to my own site: <a href="https://joshroark.com/">https://joshroark.com/</a>
	</p><p>
 </p><p>All the posts you see here should also be available there.  I'll keep this site on Technet available for a while until the migration is complete.
</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: All about non-imported user profiles</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-all-about-non-imported-user-profiles</link>
      <pubDate>Wed, 21 Nov 2018 10:34:03 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=4365</guid>
      <description><![CDATA[I find there is much confusion around this topic, so I'll try to clear it up here.
First off,...]]></description>
      <content:encoded><![CDATA[<p>I find there is much confusion around this topic, so I'll try to clear it up here.
</p><p>First off, non-imported profiles are well… <span style="text-decoration:underline">not imported</span>.  They were <span style="text-decoration:underline">not</span> created by Profile Sync / AD Import / Sync with External Identity Manager.  We also refer to these as "unmanaged", or "stub" profiles because they typically only contain the minimum amount of user data -- usually just the users account name.
</p><p><strong>Note:</strong> in this article, I will use the terms profile import / profile sync interchangeably.  For our purposes here, it does not matter whether AD Import or FIM Sync is used to get profiles into SharePoint.
</p><p>
 </p><h2>Where do they come from?
</h2><p>There are a few ways to create user profiles that are "unmanaged".  I will list them here from most common to least:
</p><ol><li>Users just browsing to their profile page or mysite.  If a user tries to access any user profile-related pages, and they don't already have a user profile in the UPA, one will be created for them automatically.  This will be a "stub" profile with a limited set of data for the user.
</li><li>From a different farm or different UPA.  You example, maybe you had profiles imported in a SharePoint 2013 farm.  If you then migrate that UPA to a 2016 farm, but you don't select all the same OUs / containers that you had in the 2013 farm, all of the users that live in the containers you missed will become "unmanaged profiles".
</li><li>Created programmatically.  You can use PowerShell or object model code to create user profiles.  Unless you are also filling in additional data at creation time, these will be "stub"-looking profiles as well.
</li><li>By a 3rd party.  This is really just a variation of #3, but 3rd party solutions (Newsgator comes to mind in particular) can create profiles programmatically.
</li></ol><p>
 </p><h2>What's the harm?
</h2><p>There's not much really.  The main ticket generator that we see is that someone will notice that a certain users profile shows up in people search results, or in the organization chart, or somewhere else unexpectedly.  They may be considered "unexpected" for one of several reasons:
</p><ul><li>They are not in an OU selected for import / sync.
</li><li>They are deleted or disabled in Active Directory.
</li><li>They should be subject to an import / sync connection filter.
</li></ul><p>A second scenario we see is that a profile that belongs to a valid user will not be getting any updates from Active Directory.  For example, their title changes in AD, but stays the same in their user profile.  This will happen if their profile is "unmanaged".  Since it's not being Synched, it won't get any updates from AD.
</p><p>
 </p><h2>What to do?
</h2><p>Depends on what your goal is for these profiles.  You're typically going to have one of these two objectives:
</p><h3><span style="font-family:Rockwell">I --</span> Turn them into managed profiles so profile import / sync can update and maintain them.
</h3><p>If you intended these user profiles to be imported, but they weren't (and therefore were created as "stub" profiles) then you need to start by determining why they were not imported  We also refer to this condition as being "out of scope" for the import.  There are only a few reasons:
</p><ol><li><div>They are in an OU that is not included in the import connection.  No really, go double-check the distinguished name of the user in question, and compare against the OUs selected in your import connection. -- I've seen too many assumptions on where the user currently exists in AD and what the connection should be importing. 
</div><p>Seriously, don't assume, go check.  You can use the following PowerShell to look up a given user and output their Distinguished Name (DN):
</p><p style="margin-left: 36pt"><span style="font-family:Consolas;font-size:9pt;background-color:lightgrey">$accountName = "josh"
</span></p><p style="margin-left: 36pt"><span style="font-family:Consolas;font-size:9pt;background-color:lightgrey">$prop = ([adsisearcher]"samAccountName=$($accountName)").FindOne().Properties
</span></p><p style="margin-left: 36pt"><span style="font-family:Consolas;font-size:9pt;background-color:lightgrey">$prop.displayname
</span></p><p style="margin-left: 36pt"><span style="font-family:Consolas;font-size:9pt"><span style="background-color:lightgrey">$prop.distinguishedname</span>
				</span></p><p>
 </p><p style="margin-left: 36pt">The output will look something like this:
</p><p style="margin-left: 36pt"><span style="font-family:Consolas;font-size:9pt">Josh Roark
</span></p><p style="margin-left: 36pt"><span style="font-family:Consolas;font-size:9pt">CN=Josh Roark,<span style="background-color:yellow">OU=Admins,OU=MyUsers,DC=joroar,DC=local</span>
				</span></p><p>
 </p><p style="margin-left: 36pt">The part of the DN starting with "OU" indicates the container this user exists in.  You need to select that container ("Admins"). Selecting its parent container ("MyUsers") by default, will also select any child containers and will also result in the user being imported.
</p><p style="margin-left: 36pt"><img src="https://msdnshared.blob.core.windows.net/media/2018/12/123018_1459_SharePointA1.png" alt="" />
			</p></li><li><div>They are subject to an import connection filter.  This is one place where there is a significant difference between FIM Sync and AD import.  The filtering is done entirely differently.  AD Import uses a standard LDAP filter, so you can use tools like LDP.exe or LDAP Explorer to verify whether or not the filter in place should return the user.  With FIM Sync, exclusion filters are used, so it's a matter of understanding the filters and checking against the AD attribute values for the user.
</div><p>
 </p></li><li>This is rare, but there is a known issue where if the LastKnownParent attribute is set on the user in Active Directory, it could result in the user not being imported.  Read more here: <a href="https://support.microsoft.com/en-us/help/313301">https://support.microsoft.com/en-us/help/313301</a>
		</li></ol><p>
 </p><p><strong>Note:</strong> It is not necessary to delete these "stub" profiles first.  If a profile was first created as a "stub" / "unmanaged" / "non-imported" profile, but then later profile import / sync pulls that user in, the existing profile will be updated by the sync, and will become a "managed" profile from that point forward.
</p><p>
 </p><h3><span style="font-family:Rockwell">II --</span> Remove them.
</h3><p>If you don't want these profiles around, then you need to take some action to get rid of them.
</p><p>Number one, you should not be looking to profile import / sync to fix this for you.  Remember, these profiles were not imported, so the profile sync process does not manage them at all.  In general, if profile sync did not create the profile, it can't delete it either.
</p><p>Get a list of non-imported profiles. This is rather easy.  Just run PowerShell like this:
</p><p><span style="font-family:Consolas;font-size:9pt;background-color:lightgrey">$upa = Get-spserviceapplication | ?{$_.typename -match "profile"}
</span></p><p><span style="font-family:Consolas;font-size:9pt"><span style="background-color:lightgrey">Set-SPProfileServiceApplication $upa -GetNonImportedObjects $true | out-file c:\temp\NonImportedProfiles.txt</span>
		</span></p><p>
 </p><p>Then go have a look at the NonImportedProfiles.txt file.
</p><p>The GetNonImportedObjects flag will only return unmanaged / "stub" profiles.  If a user account is in this list, it means they were most certainly <span style="text-decoration:underline">not</span> imported, so if there's any question as to whether or not a certain user has been imported by AD Import / Sync, these results should be definitive.
</p><p>If the contents of NonImportedProfiles.txt looks like the list of user profiles you'd like to remove, then you can run this:
</p><p><span style="font-family:Consolas;font-size:9pt;background-color:lightgrey">$upa = Get-spserviceapplication | ?{$_.typename -match "profile"}
</span></p><p><span style="font-family:Consolas;font-size:9pt"><span style="background-color:lightgrey">Set-SPProfileServiceApplication $upa -PurgeNonImportedObjects $true</span>
		</span></p><p>
 </p><p>Please note that this is all or nothing.  The <strong>Purge</strong>NonImportedObjects command will mark all of the profiles for deletion that <strong>Get</strong>NonImportedObjects returned.  If there are legitimate user profiles returned by <strong>Get</strong>NonImportedObjects, then you should see the "Turn them into managed profiles…" section above for ideas on how to get them imported.
</p><p><strong>Purge</strong>NonImportedObjects does <span style="text-decoration:underline">not</span> immediately delete the non-imported profiles.  It just marks them for deletion (bdeleted = 1 in the UserProfile_Full table of the Profile database).  Once they have been marked for deletion, it is the responsibility of the "My Site Cleanup Job" timer job to remove them, which is no different for "managed" profiles that have been marked for deletion by profile import / sync.</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint – SAML auth: Users are authenticated as the wrong account</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-saml-auth-users-are-authenticated-as-the-wrong-account</link>
      <pubDate>Mon, 19 Nov 2018 15:33:50 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=4345</guid>
      <description><![CDATA[This is a pretty unique scenario, but it came up recently and exposed a little-known configuration...]]></description>
      <content:encoded><![CDATA[<p>This is a pretty unique scenario, but it came up recently and exposed a little-known configuration "gotcha" with SharePoint.
</p><h2>Consider the following scenario:
</h2><ul><li><div>You have two Trusted Providers (SAML auth) and are using them both for the same web application.
</div><ul><li>For example, you have an <span style="background-color:lime">Internal</span> zone using URL https://teams<span style="background-color:lime">Internal</span>.contoso.com that uses Trusted Provider "ADFS-<span style="background-color:lime">Internal</span>"
</li><li>And an <span style="background-color:aqua">External</span> zone using URL https://<span style="background-color:aqua">teams.</span>contoso.com, and Trusted Provider "ADFS-<span style="background-color:aqua">External</span>"
</li></ul></li><li>You <a href="https://docs.microsoft.com/en-us/previous-versions/office/sharepoint-server-2010/hh305235(v=office.14)">create both Trusted Identity Token Issuers</a> using the same token signing certificate, creating the "ADFS-<span style="background-color:aqua">External</span>" one first. 
</li><li>When internal users browse to the site, they are authenticated, but receive the "<em>Sorry, this site has not been shared with you</em>" Access Denied page.
</li><li>In reviewing the ULS logs and /or a <a href="https://www.telerik.com/fiddler">Fiddler trace</a>, you see that the <span style="background-color:lime">Internal</span> user is indeed authenticated, but is authenticated as an <span style="background-color:aqua">External</span> user, which does not have permission to the site, thus the "access denied".
</li></ul><p>
 </p><p><strong>Notes: 
</strong></p><ul><li>I cannot come up with a practical scenario for using two separate providers instead of handling both user types with one trusted provider, but it has happened.  More than once.
</li><li>Please forgive the references to SharePoint 2010 and ADFS 2.0 in the above link.  The steps are still valid for the most recent version of both.
</li><li>I'll use "ADFS" as my Trusted Provider example, but the same rules apply to all SAML providers (SiteMinder, Ping Federate, Okta, etc).
</li></ul><p>
 </p><h2>That's weird, why does that happen?
</h2><p>Both the Internal ("ADFS-Internal") and External ("ADFS-External") Trusted Identity Token Issuers have been configured to use <span style="text-decoration:underline">the same token signing certificate</span>.
</p><p>Because SharePoint uses the certificate it receives from ADFS to match the Trusted Identity Token Issuer within SharePoint, it will match that certificate to only the first Trusted Identity Token Issuer in the list that uses that same certificate.
</p><p>In this case, the result is that it will always match the certificate to the "ADFS-External" Token Issuer because it was the first one created, and appears first in the list.
</p><p>The result is that every user will be authenticated as an External user, even when accessing the site using the Internal URL.
</p><p>
 </p><h2>You're saying the user is Authenticated.  Why do they get Access Denied?
</h2><p>Most of this goes back to the concept of Authentication (who are you) vs Authorization (what permission do you have). 
</p><p>However, in SharePoint, I find it's even more easily confused because the same physical person can authenticate to SharePoint as multiple different "users".
</p><p>Continuing with my example above, the same person can authenticate using the External URL with the "ADFS-External" trusted provider, and with the Internal URL with the "ADFS-Internal" trusted provider.  SharePoint sees those two users as <span style="text-decoration:underline">completely separate.</span>  Knowing that SharePoint uses the name of the Trusted Provider as part of the users account name, it should become clear why:
</p><p><strong>i:0e.t|adfs-<span style="background-color:lime">internal</span>|josh@joroar.local</strong>  is <span style="text-decoration:underline">not the same user</span> as  <strong>i:0e.t|adfs-<span style="background-color:aqua">external</span>|josh@joroar.local </strong>
	</p><p>Those two user accounts will always be treated by SharePoint as separate.  There's no way to "merge" their permission sets, or anything of the like.
</p><p>This concept is really just a variation on one I blogged about previously: <a href="https://joshroark.com/sharepoint-windows-user-not-equal-to-adfs-user/">https://joshroark.com/sharepoint-windows-user-not-equal-to-adfs-user/</a>
	</p><p>
 </p><h2>How can I tell if I have this issue?
</h2><p>You should be able to run the following PowerShell to check which certificate each Trusted Identity Token Issuer is using:
</p><p><span style="font-family:Consolas;font-size:9pt"><span style="background-color:lightgrey">Get-SPTrustedIdentityTokenIssuer | select name, signingcertificate | fl</span>
		</span></p><p>
 </p><p>Check the "Thumbprint" value on the SigningCertificate for both Token Issuers.  If it's the same value, it's the same certificate.
</p><p>
 </p><h2>What can be done?
</h2><p>If you're set on using two different Trusted Providers within the same web application, then one of them must use a different token signing certificate.  How you do that on the SAML provider side varies by implementation (ADFS, SiteMinder, Ping, OKTA, etc), so I won't get into that here.
</p><p>However, once you have a new token-signing certificate, updating SharePoint to match is quite simple.  It's the same steps you would use when your token signing certificate expires and you need to update SharePoint to use a new one. 
</p><p>The example below assumes I got a new certificate for the "Internal" trusted provider, and I'm leaving the External one alone.
</p><p>-- Update the Internal Token Issuer to use the new certificate using PowerShell:
</p><p><span style="font-family:Lucida Console;font-size:9pt;background-color:lightgrey">$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2("C:\newInternalCert.cer")
</span></p><p><span style="font-family:Lucida Console;font-size:9pt;background-color:lightgrey">$ti = Get-SPTrustedIdentityTokenIssuer "ADFS-Internal"
</span></p><p><span style="font-family:Lucida Console;font-size:9pt"><span style="background-color:lightgrey">Set-SPTrustedIdentityTokenIssuer $ti -ImportTrustCertificate $cert</span>
		</span></p><p>-- Add the new certificate to the farm trust (Central Admin | Security | Manage Trust).
</p><p>-- Make sure it's trusted at the Windows level by importing it (and any parent certificates in the cert chain) to the Trusted Root Authorities certificate store on the SharePoint servers.</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: 403 Forbidden accessing libraries and certain links in Site Settings</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-403-forbidden-accessing-libraries-and-certain-links-in-site-settings</link>
      <pubDate>Mon, 05 Nov 2018 12:59:35 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=4335</guid>
      <description><![CDATA[This was a special situation where most of the site appeared to work, but certain links under Site...]]></description>
      <content:encoded><![CDATA[<p>
 </p><p>This was a special situation where most of the site appeared to work, but certain links under Site Settings would fail with 403 Forbidden. For example:
</p><ul><li>Themes 
</li><li>Master Pages
</li><li>Solutions
</li><li>Composed looks
</li><li>List Templates
</li><li>Most document libraries
</li></ul><p>Actually, in some cases, the page request would result in Access Denied, and redirect the user to the Access Denied page (_layouts/15/AccessDenied.aspx), and that request would fail with 403 Forbidden.
</p><p>This would occur for users with full control permission on the site, even site collection administrators.
</p><p>
 </p><h2>Cause:
</h2><p>This turned out to be a configuration problem with Host-Named Site Collections (HNSC).  
</p><p>Due to a host header / IIS binding configuration issue, the request was actually being served by a different SharePoint web app / IIS site than the one we expected.  That other IIS site was running in a different application pool, which was running as a different service account.  That service account did not have enough permission to the SharePoint content to access the site.  In that case, most requests were working, but any request that called into the "SPSecurity.RunWithElevatedPrivileges" method would fail because "RunWithElevatedPrivileges" runs as the application pool account instead of the logged-on user.
</p><p>
 </p><h2>Resolution:
</h2><p>Configure your Web Apps and IIS bindings properly for HNSCs.
</p><p>Typically, host-named site collections do <span style="text-decoration:underline">not</span> use host header bindings in IIS as described here: <a href="https://docs.microsoft.com/en-us/SharePoint/administration/host-named-site-collection-architecture-and-deployment">https://docs.microsoft.com/en-us/SharePoint/administration/host-named-site-collection-architecture-and-deployment#use-host-headers-and-host-named-site-collections</a>
	</p><p>Host-named site collections should ideally all be hosted under the same SharePoint web application, in which case, host header bindings in IIS are unnecessary.  Or if there are multiple HNSC web apps, they all should run as the same service account, which would also avoid this problem.
</p><p>
 </p><p>
 </p><h2>Here's a sample of the error sequence seen in the SharePoint ULS logs.  
</h2><p>The giveaway is that every access denied stack contains a call to SPSecurity.RunWithElevatedPrivileges:
</p><p>
 </p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">10/29/2018 10:16:01.47    w3wp.exe (0x51F4)    0x41D0    SharePoint Foundation    Authentication Authorization    ajmmv    VerboseEx    VsecurableObject: EffectiveRightsMask=0x00000000, OriginalEffectiveRightsMask=0x00000000    922c9d9e-f771-9026-a024-8163eefb3d05
</span></p><p>
 </p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">10/29/2018 10:16:01.47    w3wp.exe (0x51F4)    0x41D0    SharePoint Foundation    General    8xfr    Verbose    PermissionMask check failed. asking for 0x08000000, have 0x00000000    922c9d9e-f771-9026-a024-8163eefb3d05
</span></p><p>
 </p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">10/29/2018 10:16:01.47    w3wp.exe (0x51F4)    0x41D0    SharePoint Foundation    General    8e2s    Medium    Unknown SPRequest error occurred. More information: 0x80070005    922c9d9e-f771-9026-a024-8163eefb3d05
</span></p><p>
 </p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">10/29/2018 10:16:01.47    w3wp.exe (0x51F4)    0x41D0    SharePoint Foundation    General    aix9j    High    SPRequest.GetUsersDataAsSafeArray: UserPrincipalName=, AppPrincipalName= ,bstrUrl=https://teams.contoso.com ,dwUsersScope=5 ,dwUserCollectionFlags=0 ,bstrValue= ,dwValue=1073741823    922c9d9e-f771-9026-a024-8163eefb3d05
</span></p><p>
 </p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">10/29/2018 10:16:01.47    w3wp.exe (0x51F4)    0x41D0    SharePoint Foundation    General    ai1wu    Medium    System.UnauthorizedAccessException: <strong>Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED)),</strong> StackTrace:   
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at Microsoft.SharePoint.SPUser.InitMember()    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at Microsoft.SharePoint.SPUser..ctor(SPWeb web, SPSecurableObject scope, String strIdentifier, Object[,] arrUsersData, UInt32 index, Int32 iByParamId, String strByParamSID, String strByParamEmail, SPUserCollectionType userCollectionType, SPUserCollectionFlags ucf, Boolean isSiteAuditor)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at Microsoft.SharePoint.SPUserCollection.GetByIDNoThrow(Int32 id)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at SharePointBoost.SharePoint.Security.SecurityUtility. . ()    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at Microsoft.SharePoint.SPSecurity.&lt;&gt;c__DisplayClass5.&lt;RunWithElevatedPrivileges&gt;b__3()    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at Microsoft.SharePoint.Utilities.<span style="background-color:yellow">SecurityContext.RunAsProcess</span>(CodeToRunElevated secureCode)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at Microsoft.SharePoint.<span style="background-color:yellow">SPSecurity.RunWithElevatedPrivileges</span>(WaitCallback secureCode, Object param)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at Microsoft.SharePoint.SPSecurity.RunWithElevatedPrivileges(CodeToRunElevated secureCode)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">&lt;stack truncated&gt;
</span></p><p>
 </p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">10/29/2018 10:16:01.47    w3wp.exe (0x51F4)    0x41D0    SharePoint Foundation    General    aep94    High    UnauthorizedAccessException for the request. <strong>403 Forbidden will be returned</strong>. Error=Exception of type 'System.Web.HttpUnhandledException' was thrown.  
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at System.Web.UI.Page.HandleError(Exception e)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at System.Web.UI.Page.ProcessRequest()    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at System.Web.UI.Page.ProcessRequest(HttpContext context)    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()    
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"> at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean&amp; completedSynchronously)
</span></p><p>
 </p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">10/29/2018 10:16:01.47    w3wp.exe (0x51F4)    0x41D0    SharePoint Foundation    General    b6p2    VerboseEx    <strong>Sending HTTP response 403 - text/plain:403 FORBIDDEN.</strong>    922c9d9e-f771-9026-a024-8163eefb3d05
</span></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: Check Permissions and External Tokens – ADFS (SAML auth)</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-check-permissions-and-external-tokens-adfs-saml-auth</link>
      <pubDate>Wed, 03 Oct 2018 11:09:59 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=3845</guid>
      <description><![CDATA[This post is the third part of a series on the "Check Permissions" function. It's focused on Trusted...]]></description>
      <content:encoded><![CDATA[This post is the third part of a series on the "Check Permissions" function. It's focused on Trusted Provider authentication aka: SAML-claims.

The way "Check Permissions" works varies by authentication method. For Windows or FBA auth, see my other posts:

<strong>Windows-Claims Authentication:</strong> <a href="https://blogs.technet.microsoft.com/spjr/2017/09/05/sharepoint-troubleshooting-check-permissions/">https://blogs.technet.microsoft.com/spjr/2017/09/05/sharepoint-troubleshooting-check-permissions/ </a>
<strong>Forms-based Authentication (FBA):</strong> <a href="https://blogs.technet.microsoft.com/spjr/2018/03/20/sharepoint-check-permissions-and-external-tokens-fba/">https://blogs.technet.microsoft.com/spjr/2018/03/20/sharepoint-check-permissions-and-external-tokens-fba/</a>

<strong>Notes:</strong>
<ul>
 	<li>I'll be talking about Active Directory Federation Service (ADFS), but the same concepts apply to other SAML auth providers like SiteMinder, Ping Federate, etc.</li>
 	<li>
<div>"Check Permissions" is not the only function that utilizes the External Token to determine user permissions.  Pretty much any non-interactive function in SharePoint that must determine a users permission will use the External Token.  Examples:</div>
<ul>
 	<li>Alerts</li>
 	<li>Workflow</li>
 	<li>SQL Server Reporting Services (SSRS) report subscriptions.</li>
</ul>
</li>
</ul>
<h1>First some background:</h1>
Please see the "Why should you care?" and "Background" sections of <a href="https://blogs.technet.microsoft.com/spjr/2017/09/05/sharepoint-troubleshooting-check-permissions/">my Windows Auth post</a>. That should provide some good background on External Tokens and interactive vs non-interactive refresh of the External Token, which should help explain why "Check Permissions" failures can be intermittent when the user gets their permission via group membership (role claim).<span style="color: #333333;font-family: Segoe UI;font-size: 10pt">
</span>
<h1>How is Trusted Provider / SAML / ADFS auth different?</h1>
With Trusted Provider auth, the "Check Permissions" functionality is <span style="text-decoration: underline">completely dependent </span>on your Custom Claims Provider (CCP). The CCP is responsible for looking up the user account (people picker), and augmenting their claims set (claims augmentation) by also looking up their group memberships / role claims. This claims augmentation is something that is implemented within the code of the CCP. That's important to keep in mind. It's quite possible that your CCP was not written to do augmentation, in which case there's nothing you can do in SharePoint to fix it. The CCP would have to be updated to support this functionality.
<h1>Prerequisites:</h1>
In order for this to work at all, you need to be passing group membership as a role claim, and you also need a Custom Claims Provider.
<h3>Check which claims you're passing:</h3>
<p style="background: #e7e6e6"><span style="font-family: Consolas;font-size: 9pt">Get-SPTrustedIdentityTokenIssuer |select claimtypeinformation -ExpandProperty claimtypeinformation
</span></p>
You can see I'm passing the Role claim:

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1629_SharePointC1.png" /><span style="font-family: Consolas;font-size: 9pt">
</span>
<h3>Do I have a Custom Claims Provider?</h3>
I hope so. If not, your People Picker functionality on your Trusted Provider auth web applications is probably not great.
<p style="background: #e7e6e6"><span style="font-family: Consolas;font-size: 9pt">Get-SPTrustedIdentityTokenIssuer | select name, claimprovidername
</span></p>
My Custom Claims Provider is <a href="https://ldapcp.com/">LDAPCP:</a>

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1629_SharePointC2.png" /><span style="font-family: Consolas;font-size: 9pt">
</span>
<h1>Troubleshooting:</h1>
This is going to depend on your Custom Claims Provider. As I mentioned earlier, the CCP is wholly responsible for providing this functionality. If it's not written to do this correctly (or maybe not at all), then you'll need to be in touch with the developers.
<h1>Troubleshooting Check Permissions with LDAPCP:</h1>
<a href="https://ldapcp.com/">LDAPCP</a> is an excellent custom claims provider. It covers most LDAP people picking scenarios out-of-box, and since it's an open-source project, you can tweak it to meet your needs.

I'm going to go into some depth for troubleshooting "Check Permissions" with LDAPCP because: 1.There are a lot of farms out there using LDAPCP or a customized version of it, and 2.The concepts can likely be applied to other custom claims providers as well.
<h3>1. Make sure you're adding your groups (role claims) to site permissions correctly.</h3>
The role claim you added to site permissions must <span style="text-decoration: underline">match exactly</span> the role claim within the users logon token. For example, I was recently testing this behavior and found that it wasn't working in my farm. Looking at site permissions, it looks like the correct group was added, but if I click on the group name, I can see the actual account name for the group:

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1629_SharePointC3.png" />

Notice it's <span style="text-decoration: underline">qualified by domain name </span>"c:0-.t|adfs|<span style="background-color: yellow">joroar.local\</span>group area"

However, I know that in ADFS, I'm passing <span style="text-decoration: underline">unqualified</span> group names, so it should be: "c:0-.t|adfs|group area"

If there's any question about the role claim format, I can grab a <a href="https://www.telerik.com/fiddler">Fiddler trace</a> of a user login and see which claims are being passed in the SAML assertion. Here I can confirm the group name should be <span style="text-decoration: underline">unqualified</span>:

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1629_SharePointC4.png" />

So why did LDAPCP add the group to site permissions in domain-qualified format?

Looking at my claim mappings in LDAPCP, I see that for Role, there is a "Prefix to add to value returned" value set to "{fqdn}\"

<strong>Note:</strong> This is the default behavior for the version of LDAPCP that I tested with (V2017.06). It may not be the default for all versions.

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1629_SharePointC5.png" />

After removing that, I can add the group back to site permissions and see that it's now added with the correct (unqualified) group name:

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1629_SharePointC6.png" />
<h3>2. Enable Augmentation in LDAPCP</h3>
By default (at least in V2017.06), augmentation is <span style="text-decoration: underline">not</span> enabled in LDAPCP. In order for "Check Permissions" to work consistently, it <span style="text-decoration: underline">must</span> be enabled. The UI for the augmentation settings varies by LDAPCP version, but basically, you enable it, choose which claim is your role claim, and then use the check boxes to tell LDAPCP whether or not each of your LDAP connections are to Active Directory.

<img alt="" src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1629_SharePointC7.png" />
<h3>3. Upgrade .NET.</h3>
Since LDAPCP also uses the <span style="color: #333333;font-family: Segoe UI;font-size: 10pt">GetAuthorizationGroups method, the #1 cause from my <a href="https://blogs.technet.microsoft.com/spjr/2017/09/05/sharepoint-troubleshooting-check-permissions/">Windows-auth blog post</a> also applies here.
</span>

<span style="color: #333333;font-size: 10pt"><strong>Solution:</strong> Install .<a href="https://support.microsoft.com/en-us/help/3151800/the--net-framework-4-6-2-offline-installer-for-windows"><span style="color: #337ab7">NET Framework update 4.6.2.</span></a> (or higher version)
</span>

<span style="color: #333333;font-size: 10pt"><strong>Notes:
</strong></span>
<ul>
 	<li><span style="color: #333333;font-size: 10pt">.NET Framework 4.6 is supported for SharePoint 2013 as long as you have SP1 installed.
</span></li>
 	<li><span style="color: #333333;font-size: 10pt">You can check which version of .NET Framework you have installed using <a href="https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/how-to-determine-which-versions-are-installed"><span style="color: #337ab7">steps here</span></a>.
</span></li>
 	<li><span style="color: #333333;font-size: 10pt">It's important that you upgrade .NET on <strong>every SharePoint server in the farm</strong>.
</span></li>
</ul>
<h3>4. Upgrade LDAPCP.</h3>
There have been several enhancements made to the augmentation functionality of <a href="https://github.com/Yvand/LDAPCP/releases">LDAPCP across recent versions</a>. At the time of this writing, the latest version is v11. I recommend installing / upgrading to the most recent version to get the most consistent experience.
<h3>5. Check other known-issues.</h3>
If you're using Active Directory as your back-end identity store, see Causes and Resolutions 1, 2, 4, 5, 8, and 9 <span style="color: #333333;font-family: Segoe UI;font-size: 10pt">from my <a href="https://blogs.technet.microsoft.com/spjr/2017/09/05/sharepoint-troubleshooting-check-permissions/">Windows-auth blog post</a>. </span>They all apply here as well.]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: Unique list permissions: The server was unable to save the form at this time</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-unique-list-permissions-the-server-was-unable-to-save-the-form-at-this-time</link>
      <pubDate>Mon, 01 Oct 2018 09:46:35 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=3715</guid>
      <description><![CDATA[Consider the following scenario:

 You break permission inheritance on a list and give some users...]]></description>
      <content:encoded><![CDATA[<p>
 </p><h2>Consider the following scenario:
</h2><p>
 </p><p>You break permission inheritance on a list and give some users permission to only that list.
</p><p>The users can browse to the list, but when they try to add an item to the list or edit an existing item, the following error occurs:
</p><p>
 </p><p><strong>The server was unable to save the form at this time. Please try again
</strong></p><p>
 </p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/10/100118_1506_SharePointU1.png" alt="" /><span style="color:#444444;font-family:Segoe UI;font-size:10pt">
		</span></p><p>
 </p><h2>Cause:
</h2><p>
 </p><p>This happens if the "UseRemoteAPIs" permission is removed from the "Limited Access" permission level.
</p><p>"UseRemoteAPIs" is required to add and edit items in SharePoint 2013 and 2016 because a Client-Side Object Model (CSOM) call is made to complete the update.<span style="color:#444444;font-family:Segoe UI;font-size:10pt">
		</span></p><p>
 </p><p>The "UseRemoteAPIs" permission can be either removed manually, or by activating the "Limited-access user permission lockdown mode" (ViewFormPagesLockDown) site collection feature.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/10/100118_1506_SharePointU2.png" alt="" />
	</p><p>
 </p><p><strong>Note:</strong> Sites created using the "<span style="text-decoration:underline">Publishing Portal</span>" site template will have this feature <span style="text-decoration:underline">activated by default</span>.
</p><p>
 </p><p>This feature removes the ViewFormPages and UseRemoteAPIs permissions from the "Limited Access" permission level, in which case, "Limited Access" will only contain these permissions:
</p><p><strong>Open, BrowseUserInfo, UseClientIntegration</strong>
	</p><p>
 </p><p>Turning off the feature results in an update to the Limited Access permission level to match an out-of-box Team site:
</p><p><strong>Open, BrowseUserInfo, UseClientIntegration, UseRemoteAPIs, ViewFormPages
</strong></p><p>
 </p><p>You can use this PowerShell to check the Limited Access permission level on the problem site:
</p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$siteCollectionUrl = Get-SPWeb -Identity "https://team.contoso.com"
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$lmtd = $siteCollectionUrl.RoleDefinitions['Limited Access']
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$lmtd.BasePermissions 
</span></p><p>
 </p><p>
 </p><p>
 </p><h2>Resolution:
</h2><p>Deactivate the "Limited-access user permission lockdown mode" site collection feature.
</p><p>This can be done in Site Settings | Site Collection Features, or by using PowerShell like this:
</p><p>
 </p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">Disable-SPFeature -URL "https://team.contoso.com" -Identity ViewFormPagesLockDown 
</span></p><p>
 </p><p>If the feature is already disabled, then you could try toggling it, or simply use the following PowerShell to manually add the proper permissions back to the "Limited Access" permission level:
</p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$siteCollectionUrl = Get-SPWeb -Identity "https://team.contoso.com"
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$lmtd = $siteCollectionUrl.RoleDefinitions['Limited Access']
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$b1 = [Microsoft.sharepoint.spbasepermissions]::ViewFormPages
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$b2 = [Microsoft.sharepoint.spbasepermissions]::Open
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$b3 = [Microsoft.sharepoint.spbasepermissions]::BrowseUserInfo
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$b4 = [Microsoft.sharepoint.spbasepermissions]::UseClientIntegration
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$b5 = [Microsoft.sharepoint.spbasepermissions]::UseRemoteAPIs
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$lmtd.BasePermissions = "$b1,$b2,$b3,$b4,$b5" 
</span></p><p style="background: #e7e6e6"><span style="font-family:Consolas;font-size:9pt">$lmtd.Update() 
</span></p><p>
 </p><p>
 </p><p>
 </p><p>
 </p><h2>Data Capture:
</h2><p>
 </p><h4>This is what you'd see in a <a href="https://www.telerik.com/fiddler"><span style="color:blue;text-decoration:underline">Fiddler trace</span></a>:
</h4><p>
 </p><p><strong>Client Request:</strong> (POST:https://team.contoso.com/_vti_bin/client.svc/ProcessQuery)
</p><p>
 </p><p>
 </p><p><strong>Server Response:
</strong></p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">
		</span><span style="font-family:Microsoft Sans Serif;font-size:8pt">[</span>
	</p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">{
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">"SchemaVersion":"15.0.0.0","LibraryVersion":"15.0.4905.1000","ErrorInfo":{
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt"><span style="background-color:yellow">"ErrorMessage":"Access denied. You do not have permission to perform this action or access this resource.","</span>ErrorValue":null,"TraceCorrelationId":"</span><span style="color:#444444;font-family:Segoe UI;font-size:10pt"> f682929e-089c-0012-0b83-1d144a5deb75</span><span style="font-family:Microsoft Sans Serif;font-size:8pt">","ErrorCode":-2147024891,"ErrorTypeName":"System.UnauthorizedAccessException"</span>
	</p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">},"TraceCorrelationId":"</span><span style="color:#444444;font-family:Segoe UI;font-size:10pt">f682929e-089c-0012-0b83-1d144a5deb75</span><span style="font-family:Microsoft Sans Serif;font-size:8pt">"</span>
	</p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">}
</span></p><p><span style="font-family:Microsoft Sans Serif;font-size:8pt">]
</span></p><p>
 </p><p>
 </p><p>
 </p><p>
 </p><h4>And this is what you'd see in the SharePoint ULS logs:
</h4><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Foundation    CSOM    ajwqj    Medium    <span style="background-color:yellow">Request does not have SPBasePermissions.UseRemoteAPIs permission.</span> Need to check it when each API is accessed    f682929e-089c-0012-0b83-1d144a5deb75
</span></p><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Foundation    CSOM    ajwqh    High    <span style="background-color:yellow">The request does not have required permission to access SP.RequestContext.Current</span>    f682929e-089c-0012-0b83-1d144a5deb75
</span></p><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Foundation    CSOM    ahjq1    High    Exception occured in scope Microsoft.SharePoint.SPContext.get_Current. Exception=<span style="background-color:yellow">System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.</span>     at Microsoft.SharePoint.Client.ServerStub.CheckRequiredResourceRight(ProxyContext proxyContext, String memberName, ResourceRight right)     at Microsoft.SharePoint.Client.ServerStub.CheckBlockedGetProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.ServerStub.SPContextServerStub.GetStaticProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.Client.ServerStub.GetStaticPropertyWithMonitoredScope(String propertyName, ProxyContext proxyContext)    f682929e-089c-0012-0b83-1d144a5deb75
</span></p><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Foundation    CSOM    agmjp    High    Original error: System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.     at Microsoft.SharePoint.Client.ServerStub.CheckRequiredResourceRight(ProxyContext proxyContext, String memberName, ResourceRight right)     at Microsoft.SharePoint.Client.ServerStub.CheckBlockedGetProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.ServerStub.SPContextServerStub.GetStaticProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.Client.ServerStub.GetStaticPropertyWithMonitoredScope(String propertyName, ProxyContext proxyContext)    f682929e-089c-0012-0b83-1d144a5deb75
</span></p><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Portal Server    Microfeeds    aizmo    Medium    SocialRESTExceptionProcessingHandler.DoServerExceptionProcessing - SharePoint Server Exception [System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.     at Microsoft.SharePoint.Client.ServerStub.CheckRequiredResourceRight(ProxyContext proxyContext, String memberName, ResourceRight right)     at Microsoft.SharePoint.Client.ServerStub.CheckBlockedGetProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.ServerStub.SPContextServerStub.GetStaticProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.Client.ServerStub.GetStaticPropertyWithMonitoredScope(String propertyName, ProxyContext proxyContext)]    f682929e-089c-0012-0b83-1d144a5deb75
</span></p><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Foundation    Authentication Authorization    alkvd    Medium    <span style="background-color:yellow">Throw UnauthorizedAccessException instead of SPUtilityInternal.Send401 for client.svc request.</span>    f682929e-089c-0012-0b83-1d144a5deb75
</span></p><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Foundation    CSOM    agmjp    High    Original error: System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.     at Microsoft.SharePoint.Client.ServerStub.CheckRequiredResourceRight(ProxyContext proxyContext, String memberName, ResourceRight right)     at Microsoft.SharePoint.Client.ServerStub.CheckBlockedGetProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.ServerStub.SPContextServerStub.GetStaticProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.Client.ServerStub.GetStaticPropertyWithMonitoredScope(String propertyName, ProxyContext proxyContext)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.InvokeStaticGetProperty(String typeId, String propName)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.GetObjectFromObjectPath(XmlElement xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.GetObjectFromObjectPathId(String objectPathId)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.ProcessInstantiateObjectPath(XmlElement xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.ProcessOne(XmlElement xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.ProcessStatements(XmlNode xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.Process()    f682929e-089c-0012-0b83-1d144a5deb75
</span></p><p>
 </p><p><span style="color:#444444;font-family:Segoe UI;font-size:10pt">09/26/2018 08:12:39.10    w3wp.exe (0x29F0)    0x0868    SharePoint Portal Server    Microfeeds    aizmo    Medium    SocialRESTExceptionProcessingHandler.DoServerExceptionProcessing - SharePoint Server Exception [System.UnauthorizedAccessException: Attempted to perform an unauthorized operation.     at Microsoft.SharePoint.Client.ServerStub.CheckRequiredResourceRight(ProxyContext proxyContext, String memberName, ResourceRight right)     at Microsoft.SharePoint.Client.ServerStub.CheckBlockedGetProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.ServerStub.SPContextServerStub.GetStaticProperty(String propName, ProxyContext proxyContext)     at Microsoft.SharePoint.Client.ServerStub.GetStaticPropertyWithMonitoredScope(String propertyName, ProxyContext proxyContext)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.InvokeStaticGetProperty(String typeId, String propName)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.GetObjectFromObjectPath(XmlElement xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.GetObjectFromObjectPathId(String objectPathId)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.ProcessInstantiateObjectPath(XmlElement xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.ProcessOne(XmlElement xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.ProcessStatements(XmlNode xe)     at Microsoft.SharePoint.Client.ClientMethodsProcessor.Process()]    f682929e-089c-0012-0b83-1d144a5deb75</span></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint – Intermittent "Sorry, this site hasn't been shared with you"</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-intermittent-sorry-this-site-hasnt-been-shared-with-you</link>
      <pubDate>Tue, 04 Sep 2018 10:07:40 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=3675</guid>
      <description><![CDATA[Consider the following scenario:
Randomly, when a user browses to a resource (site, list, etc) that...]]></description>
      <content:encoded><![CDATA[<h2>Consider the following scenario:
</h2><p>Randomly, when a user browses to a resource (site, list, etc) that they are supposed to have access to, they receive "<strong>Sorry, this site hasn't been shared with you</strong>" (access denied).
</p><p>The users continue to get Access Denied for a period of time, and then it starts working again after making no changes.
</p><p>You check site permissions and the user appears to have the appropriate permission on the site.
</p><p><strong>Important:</strong> The user shows correct permission and automatically gets access again, which is in contrast to a similar behavior I wrote about here:<span style="color:#333333;font-family:Segoe UI;font-size:10pt">
			<a href="https://blogs.technet.microsoft.com/spjr/2017/07/12/sharepoint-users-randomly-lose-permission-are-deleted-from-site/">https://blogs.technet.microsoft.com/spjr/2017/07/12/sharepoint-users-randomly-lose-permission-are-deleted-from-site/</a>
		</span></p><p>
 </p><h2>Odd behavior… Why?
</h2><p>This issue occurs on <span style="text-decoration:underline">Publishing</span> sites where permission inheritance is broken, and the affected users have access only to a sub-site, and not the top-level site in the site collection.
</p><p>It occurs when the built-in SharePoint group "Style Resource Readers" has been messed with in some way.
</p><p>When a user browses to a sub-site within a Publishing site collection, the Master Page, CSS files, etc that are stored in the top-level site are used to render the sub-site page.  Therefore, users at the sub-site level must have access to (at least) these items in the top-level site.
</p><p>The "Style Resource Readers" group is used to give that limited permission to the required resources on the top-level site.  These resources include the Master Page Gallery, Style Library, and Site Collection Images.
</p><p>
 </p><h2>Fix: Verify Style Resource Readers group permissions and membership are intact:
</h2><p><strong>Note:</strong> In this example, affected users have permission only at sub-site https://team.contoso.com/sites/TL/Stuff.  They have no permission at top-level site https://team.contoso.com/sites/TL.
</p><ul><li><div><strong>Make sure the Style Resource Readers group is in place and has proper permission: 
</strong></div><ul><li>Browse to top-level site: https://team.contoso.com/sites/TL
</li><li>Go to Site Settings | People and Groups.
</li><li>There should be a group called "Style Resource Readers".
</li><li>That group should contain "Everyone" and "NT AUTHORITY\authenticated users".  If it doesn't, add those back.
</li></ul><p>
 </p></li><li><div><strong>Make sure Style Resource Readers has proper permission to the Master Page Gallery. 
</strong></div><ul><li>Browse to top-level site: https://team.contoso.com/sites/TL
</li><li>Go to Site Settings |Master Pages and Page Layouts | Library Settings | Permissions for this document library.
</li><li>Verify that "Style Resource Readers" is listed there with "Read" permission. If it isn't, add it back.
</li></ul><p>
 </p></li><li><div><strong>Make sure Style Resource Readers has proper permission to the Style Library. 
</strong></div><ul><li>Browse to top-level site: https://team.contoso.com/sites/TL
</li><li>Go to Site Contents | Style Library | Library Settings | Permissions for this document library.
</li><li><div>Verify that "Style Resource Readers" is listed there with "Restricted Read" permission. If it isn't, add it back.
</div><p>
 </p><p>
 </p></li></ul></li></ul><h2>Explanation of why this access denied behavior may be intermittent: <span style="font-size:11pt"> </span>
	</h2><ul><li>The affected users don't have any access to the top-level site in the site collection: https://team.contoso.com/sites/TL
</li><li>There are publishing controls at the sub-site level: https://team.contoso.com/sites/TL/Stuff that occasionally require access to items in the top-level site.
</li><li>These controls are cached, so the user does not need access to the top-level site on every request. – That's why it works sometimes.
</li><li>The application pool for the site recycles, usually sometime between 1am and 3am, local server time.
</li><li>These controls are no longer cached.  It now fails because the end-user doesn't have any permission to the top-level site.
</li><li>Then a user that <em>does</em> have permission to the top-level site logs in and the controls are cached again, making it work for all users.
</li><li>This continues to work until the app pool recycles again.
</li></ul><p>
 </p><h2>A few other "Style Resource Readers" references:
</h2><p><a href="https://blogs.msdn.microsoft.com/joetalksmicrosoft/2017/06/28/do-not-delete-style-resource-readers-group/"><span style="font-family:Segoe UI;font-size:10pt">https://blogs.msdn.microsoft.com/joetalksmicrosoft/2017/06/28/do-not-delete-style-resource-readers-group/</span></a><span style="color:#333333;font-family:Segoe UI;font-size:10pt">
		</span></p><p><a href="https://brmorris.blogspot.com/2012/04/access-denied-editing-or-creating-pages.html"><span style="font-family:Segoe UI;font-size:10pt">https://brmorris.blogspot.com/2012/04/access-denied-editing-or-creating-pages.html</span></a><span style="color:#333333;font-family:Segoe UI;font-size:10pt">
		</span></p><p><a href="https://support.office.com/en-us/article/Default-SharePoint-groups-in-SharePoint-Server-50855943-C151-42BF-B6EA-07F2BB366ECC"><span style="font-family:Segoe UI;font-size:10pt">https://support.office.com/en-us/article/Default-SharePoint-groups-in-SharePoint-Server-50855943-C151-42BF-B6EA-07F2BB366ECC</span></a><span style="color:#333333;font-family:Segoe UI;font-size:10pt">
		</span></p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: Quick Edit – The user does not exist or is not unique</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-quick-edit-the-user-does-not-exist-or-is-not-unique</link>
      <pubDate>Wed, 22 Aug 2018 09:59:20 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=3505</guid>
      <description><![CDATA[Consider the following scenario:
You have a SharePoint 2013 or 2016 web application that has both...]]></description>
      <content:encoded><![CDATA[<h2>Consider the following scenario:
</h2><p>You have a SharePoint 2013 or 2016 web application that has both Windows and Trusted Provider / SAML authentication (ADFS, etc) enabled.
</p><p>You have a list with a "Person or Group"-type (aka: "people picker") column in it.
</p><p>You edit the list using the "Quick Edit" / "edit this list" functionality to edit the list in a datasheet-style view.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/08/082218_1532_SharePointQ1.png" alt="" />
	</p><p>You search for a user account in the Person or Group column and it resolves correctly:
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/08/082218_1532_SharePointQ2.png" alt="" />
	</p><p>
 </p><p>You hit enter to go to the next row and you get an error on the first row that says: <strong>"The user does not exist or is not unique".</strong>
	</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/08/082218_1532_SharePointQ3.png" alt="" />
	</p><p>This seems very odd since you just, seconds before, successfully resolved that to a single user account.
</p><p><strong>Note:</strong> This may only occur for users not already added to the site collection.  More on that later…
</p><p>
 </p><h2>So why does this happen?
</h2><p>When you hit enter to go to the next row, the "Quick Edit" control tries to update the list item.   It must re-resolve the user that you entered into the People Picker column.
</p><p>It does so using the users email address. It calls into all available claims providers including Active Directory and your Trusted Provider, which <span style="text-decoration:underline">both</span> return results.
</p><p>That's why we get the "The user does not exist or is not unique" error.  We did not get a single <span style="text-decoration:underline">unique</span> result.
</p><p>
 </p><h2>Solutions:
</h2><p>This one does not have an ideal solution at the moment.  
</p><p>It only occurs when there are multiple authentication providers enabled on the web application, and only when using the "Quick Edit" control, so if you avoid either of those, you won't see the problem.  That's more like "problem avoidance" than a "solution", but I do have a workaround.
</p><p><strong>Workaround:</strong>  For the user account that fails to resolve, add them to any SharePoint group or "person or group"-type list column in the site.  It doesn't have to be the same list, you can add them anywhere in the entire site collection, and then "Quick Edit" should be able to properly resolve them.
</p><p>
 </p><p>Here I'm just using the normal new item form to add my "Test 1" user to my list.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/08/082218_1532_SharePointQ4.png" alt="" />
	</p><p>Not only does that work to add the user to the "person or group" column, after doing so, I'm also able to successfully add the same user using "Quick Edit":
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/08/082218_1532_SharePointQ5.png" alt="" />
	</p><p><strong>Why this works:</strong> When the user already exists in the site collection, the "Quick Edit" control still re-resolves the user and gets multiple matches, but it then uses those results to match to the User Information List for the site collection and resolve it to a single unique user account.  So all you have to do is use the normal (non-quick edit) new item or edit item forms to add the user to any person or group column.  After doing that once, you then should be able to add that same user using the "Quick Edit" view on the same list or any other list in the site collection.
</p><p>
 </p><p>
 </p><h2>Technical details:
</h2><p><strong>Note:</strong> While I've seen this happen in both SharePoint 2013 and 2016, all my testing was done on SharePoint 2016 at build 16.0.4639.1002.
</p><p>
 </p><p>In your SharePoint ULS logs, you'll see something like this:
</p><p><span style="font-family:Lucida Console;font-size:9pt">08/14/2018 09:28:46.95 w3wp.exe (0x18E8) 0x2E70 SharePoint Foundation Resolve ax7nk Medium Found multiple matches for resolution. Web: 'd21a207d-0726-4779-8e8d-c0cb97011805', WebApp: 'null', <span style="background-color:yellow">Input: 'test1@contoso.com'</span>, PrincipalType: 'User, SecurityGroup, SharePointGroup', PrincipalSource: 'UserInfoList, MembershipProvider, RoleProvider', <strong><span style="background-color:yellow">MatchCount: '3'</span>.</strong> 3ab0849e-e089-e088-a10e-e4e9a4c5effc
</span></p><p><span style="font-family:Lucida Console;font-size:9pt">08/14/2018 09:28:46.95 w3wp.exe (0x18E8) 0x2E70 SharePoint Foundation General 8kh7 High <span style="background-color:yellow">The user does not exist or is not unique</span>. 3ab0849e-e089-e088-a10e-e4e9a4c5effc
</span></p><p><span style="font-family:Lucida Console;font-size:9pt">08/14/2018 09:28:46.95 w3wp.exe (0x18E8) 0x2E70 SharePoint Foundation General art2g High ListItemUpdate ExpectedFailure: Microsoft.SharePoint.SPException: The user does not exist or is not unique. ---&gt; System.Runtime.InteropServices.COMException: <span style="background-color:yellow">The user does not exist or is not unique</span>.     at Microsoft.SharePoint.Library.SPRequestInternalClass.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32&amp; plID, String&amp; pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object&amp; pvarAttachmentNames, Object&amp; pvarAttachmentContents, Object&amp; pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bUnRestrictedUpdateInProgress, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)     at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32&amp; plID, String&amp; pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object&amp; pvarAttachmentNames, Object&amp; pvarAttachmentContents, Object&amp; pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bUnRestrictedUpdateInProgress, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)     --- End of inner exception stack trace ---     at Microsoft.SharePoint.SPGlobal.HandleComException(COMException comEx)     at Microsoft.SharePoint.Library.SPRequest.AddOrUpdateItem(String bstrUrl, String bstrListName, Boolean bAdd, Boolean bSystemUpdate, Boolean bPreserveItemVersion, Boolean bPreserveItemUIVersion, Boolean bUpdateNoVersion, Int32&amp; plID, String&amp; pbstrGuid, Guid pbstrNewDocId, Boolean bHasNewDocId, String bstrVersion, Object&amp; pvarAttachmentNames, Object&amp; pvarAttachmentContents, Object&amp; pvarProperties, Boolean bCheckOut, Boolean bCheckin, Boolean bUnRestrictedUpdateInProgress, Boolean bMigration, Boolean bPublish, String bstrFileName, ISP2DSafeArrayWriter pListDataValidationCallback, ISP2DSafeArrayWriter pRestrictInsertCallback, ISP2DSafeArrayWriter pUniqueFieldCallback)     at Microsoft.SharePoint.SPListItem.AddOrUpdateItem(Boolean bAdd, Boolean bSystem, Boolean bPreserveItemVersion, Boolean bNoVersion, Boolean bMigration, Boolean bPublish, Boolean bCheckOut, Boolean bCheckin, Guid newGuidOnAdd, Int32&amp; ulID, Object&amp; objAttachmentNames, Object&amp; objAttachmentContents, Boolean suppressAfterEvents, String filename, Boolean bPreserveItemUIVersion)     at Microsoft.SharePoint.SPListItem.UpdateInternal(Boolean bSystem, Boolean bPreserveItemVersion, Guid newGuidOnAdd, Boolean bMigration, Boolean bPublish, Boolean bNoVersion, Boolean bCheckOut, Boolean bCheckin, Boolean suppressAfterEvents, String filename, Boolean bPreserveItemUIVersion) 3ab0849e-e089-e088-a10e-e4e9a4c5effc
</span></p><p>
 </p><p>
 </p><p>
 </p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: SAML Authentication - Nested Groups and Role Claims</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-saml-authentication-nested-groups-and-role-claims</link>
      <pubDate>Tue, 07 Aug 2018 16:30:45 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=3425</guid>
      <description><![CDATA[I came across this topic troubleshooting a support case where users were getting Access Denied to a...]]></description>
      <content:encoded><![CDATA[<p>I came across this topic troubleshooting a support case where users were getting Access Denied to a site using Trusted Provider (SAML) authentication.
</p><h2>The Issue:
</h2><p>Users were given permission to the site using a group that had other groups nested in it.  The users were <span style="text-decoration:underline">not direct</span> members of the group being used for permission.  For example:
</p><p><strong>Contoso\Level1</strong> – Users are direct members of this group.
</p><p><strong>Contoso\Level2</strong> – No users in this group, only the "Level1" group and some other groups.  This is the group used in SharePoint site permissions.
</p><p>So we got a Fiddler trace of the user logging in via SAML auth and found that their SAML assertion only contained Role claims for the "Level1" group, and <span style="text-decoration:underline">not</span> the "Level2" groups.  If your SAML assertion does not contain a certain group, then SharePoint does not believe you are a member of that group, and you will not get any permission that has been assigned to that group within SharePoint.
</p><h2>Research:
</h2><p>In my research, I wasn't finding any definitive answers about whether or not nested groups should typically be part of a users Role claims, so I tested it.  <strong>Short answer:</strong> it depends on which attribute you have mapped to your Role claim in your Relying Party Trust.
</p><h2>Testing:
</h2><p>I tested this in my lab with Active Directory Federation Services (AD FS) as my Trusted Provider, and found that as long as I was using the standard "Token-Groups" attributes mapped to "Role" in my claim rules, all groups, <span style="text-decoration:underline">including nested groups</span> showed in my SAML assertion.
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/08/080718_2130_SharePointS1.png" alt="" />
	</p><p>Upon further investigation, I found that in my customers case, they were not using ADFS.   They were using a 3<sup>rd</sup>-party trusted provider that was using the "MemberOf" Active Directory attribute to map to the Role claim.  The problem with that is the MemberOf AD attribute only contains groups the user is a <span style="text-decoration:underline">direct</span> member of.
</p><p>
 </p><h2>The Fix:
</h2><p>Either change the claims mappings for Role to use the Token-Groups attribute, or only use groups in site permissions that users are direct members of.
</p>]]></content:encoded>
    </item>
    <item>
      <title>SharePoint: Windows user not equal to ADFS user</title>
      <link>https://docs.microsoft.com/archive/blogs/spjr/sharepoint-windows-user-not-equal-to-adfs-user</link>
      <pubDate>Tue, 24 Jul 2018 15:46:14 GMT</pubDate>
      <dc:creator><![CDATA[SPJR]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.technet.microsoft.com/spjr/?p=3385</guid>
      <description><![CDATA[I've been over this concept with customers and support engineers so many times, that I'm not sure...]]></description>
      <content:encoded><![CDATA[<p>I've been over this concept with customers and support engineers so many times, that I'm not sure why I haven't posted about it before.
</p><p>My colleague Adam <a href="https://blogs.technet.microsoft.com/adamsorenson/2018/02/27/migrate-usersmove-spusers-when-moving-from-windows-to-samlfba/">posted on this topic</a> a while back, but I wanted to expand on that a bit.
</p><h1>The Setup:
</h1><p>Let's say you have a SharePoint (2010, 2013, 2016, 2019, -- doesn't matter) web application using Windows-Claims authentication: https://share.contoso.com
</p><p>You've been using this for years, assigning permissions all over the sites.  
</p><p>You then decide to make the site available externally, so you configure Active Directory Federation Services (aka: ADFS or AD FS) and configure the https://share.contoso.com web application to use that authentication type as well.
</p><p><strong>Note:</strong> In this article, I talk about "ADFS", but this applies to <span style="text-decoration:underline">any</span> "Trusted Provider" (SAML / WS-FED) authentication provider like SiteMinder, OKTA, PING, ForgeRock, etc.
</p><p>You browse to the site and log in via ADFS and you're greeted with the Access Denied page:
</p><p>"Sorry, this site hasn't been shared with you"
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1735_SharePointW1.png" alt="" />
	</p><p>You then log out and log into the same site using your Windows Credentials, and you get the access you expect.
</p><p>
 </p><p>
 </p><h1>A Common Misconception:
</h1><p>As far as SharePoint is concerned, your Windows auth account and your ADFS auth account are <span style="text-decoration:underline">completely separate users</span>.
</p><p>As such, your ADFS account must be permissioned separately.  It has none of the access that your Windows auth account has, and there is no way to "link" the two.
</p><p>I don't blame you for expecting the ADFS account to have the same permissions as the Windows account.  After all, they both come from the same user object in Active Directory.  However, SharePoint doesn't actually know that you're using Active Directory or ADFS.  All SharePoint knows is that you're using "Trusted Provider" authentication and it received a SAML token that was signed by a trusted certificate.  That SAML token could be from ADFS with an Active Directory back-end, or it could be from Ping Federate with a SUN LDAP back-end, or anything in between.  
</p><p>If you look at the account names used in each case, it should become clear:
</p><p><img src="https://msdnshared.blob.core.windows.net/media/2018/10/100318_1735_SharePointW2.png" alt="" />
	</p><p>As you can see, the account names are different.  As far as SharePoint is concerned, they're as different as "Bob" and "Jeff", and will never "share" permissions.
</p><p>
 </p><h1>What to do?
</h1><p>There are a few options:
</p><p>1. Re-permission all of your accounts separately so that the ADFS version of the user has the same access as the Windows version.
</p><p><strong>Note:</strong> This is by far the<span style="text-decoration:underline"> worst </span>option, especially if you plan to allow users to continue using both auth methods.  There's nothing to "link" the accounts or keep their permissions in sync.  Not to mention, 'person or group' list columns (like "Modified By") will show different user accounts depending on how the user authenticated.  This is pretty much unmanageable.  I only mention it first to get it out of the way.
</p><p>
 </p><p>2. Use one authentication method or the other, not both.  You would want to migrate all of your Windows accounts to their respective ADFS accounts within SharePoint.  There are a few different ways to do this including the <a href="https://docs.microsoft.com/en-us/powershell/module/sharepoint-server/convert-spwebapplication?view=sharepoint-ps">Convert-SPWebApplication</a> command, and <a href="https://docs.microsoft.com/en-us/powershell/module/sharepoint-server/move-spuser?view=sharepoint-ps">Move-SPuser</a>.  See this post from my colleague Adam, where he walks through it: <a href="https://blogs.technet.microsoft.com/adamsorenson/2018/01/17/sharepoint-20132016-migrate-from-windows-claims-to-adfs/">https://blogs.technet.microsoft.com/adamsorenson/2018/01/17/sharepoint-20132016-migrate-from-windows-claims-to-adfs/</a>
	</p><p>If you decide to go the Convert-SPWebApplication route, see this KB article I wrote a while back: <a href="https://support.microsoft.com/en-us/help/3042604/">https://support.microsoft.com/en-us/help/3042604/</a>
	</p><p><strong>Important</strong>: Please keep in mind that migrating accounts in SharePoint using Move-SPUser or $farm.MigrateUserAccount is a <span style="text-decoration:underline">farm-wide</span> operation, and has implications for all of your web applications and even some of your service applications, in particular, the User Profile Service App.  User profiles are also aligned with an authentication provider.  You can have Windows-auth profiles and <a href="https://blogs.msdn.microsoft.com/brporter/2010/07/19/trusted-identity-providers-user-profile-synchronization/">Trusted Provider-auth profiles</a>.  There are a few problems you can run into if you have multiple profiles for the same user.  Most commonly, it can result in Workflows failing with 401 - unauthorized.  
</p><p>See: <a href="https://docs.microsoft.com/en-us/SharePoint/security-for-sharepoint-server/plan-for-app-authentication-in-sharepoint-server">https://docs.microsoft.com/en-us/SharePoint/security-for-sharepoint-server/plan-for-app-authentication-in-sharepoint-server</a>  Excerpt: <em>"Furthermore, SharePoint Server <span style="text-decoration:underline">expects only one entry</span> in the User Profile service application for a given lookup query that is based on one or more of these four attributes. Otherwise, it returns an error condition that multiple user profiles were found. Therefore, you should delete obsolete user profiles in the User Profile service application periodically to avoid multiple user profiles."
</em></p><p>Therefore, if you're going to run your farm in a "mixed mode", with some web apps using Windows Auth and some using Trusted Provider Auth, it's best to have separate User Profile Service Apps for each web app type.
</p><p>
 </p><p>3. Use Web Application Proxy (WAP) to separate the ADFS authentication piece from SharePoint.  The idea here is that you use ADFS to authenticate to WAP, which then translates you into a Window auth token, and passes that on to SharePoint.  This is kind of "the best of both worlds".  You can use it to enable external access to SharePoint and authenticate via ADFS, yet you don't have to migrate any of your users within SharePoint because it's still using Windows auth by the time you get to SharePoint.  References:
</p><p><a href="https://www.sharepoint4developers.net/en-nz/post/wap-adfs-sp2013-kerberos.aspx">https://www.sharepoint4developers.net/en-nz/post/wap-adfs-sp2013-kerberos.aspx</a>
	</p><p><a href="https://blogs.msdn.microsoft.com/sambetts/2017/04/04/sharepoint-web-application-proxy-2016-edition/">https://blogs.msdn.microsoft.com/sambetts/2017/04/04/sharepoint-web-application-proxy-2016-edition/</a>
	</p><p><a href="https://blogs.msdn.microsoft.com/sambetts/2015/07/01/sharepoint-server-and-web-application-proxy-continued/">https://blogs.msdn.microsoft.com/sambetts/2015/07/01/sharepoint-server-and-web-application-proxy-continued/</a></p>]]></content:encoded>
    </item>
  </channel>
</rss>