2014-10-14 6 views
0

(https://social.technet.microsoft.com/Forums/sharepoint/en-US/6b02dfe8-5594-4d25-991a-51ac9a0528b7/sharepoint-2013-fba-errorcould-not-retrieve-the-iis-settingsparameter-name-context?forum=sharepointadminprevious 원래의 포스트가 여기에 있습니다 :)를 IIS Settings.Parameter 이름을 검색 할 수 없습니다 윈도우 라이브 토큰 (aouth 2.0)을 얻고 윈도우 라이브 사용자 프로필. 내 셰어 포인트 사이트로 리디렉션됩니다.셰어 포인트 2013 FBA 오류 : 나는 창문을 일부 게시물에서 셰어 포인트 2013을 로그인 사는 사용하려고</p> <p>내가 수 : 문맥

나는 내 사용자 정의 로그인 페이지를 개발하기 위해 몇 가지 기사를 따르 RoleProvider { 공공 재정의 : 내 멤버 자격 공급자 및 역할 공급자

public class LiveMembershipProvider : MembershipProvider 
{ 
    private MembershipUserCollection employees; 
    private void generateUsers() 
    { 
    //Mock Data 
     employees = new MembershipUserCollection(); 
     employees.Add(new MembershipUser(this.Name, "Jack Chen", "JackChen", "[email protected]", "What your Name?", "I am Jack", true, false, DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today)); 
     employees.Add(new MembershipUser(this.Name, "Bruce Li", "BruceLi", "[email protected]", "How are u?", "How old are u", true, false, DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today)); 
     employees.Add(new MembershipUser(this.Name, "Eyes Wang", "EyesWang", "[email protected]", "What the hell?", "what the fuck", true, false, DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today, DateTime.Today)); 
    } 
public override MembershipUserCollection FindUsersByName(string usernameToMatch, int pageIndex, int pageSize, out int totalRecords) 
{ 
    if (employees == null) generateUsers(); 
    MembershipUserCollection returnFoundUsers = new MembershipUserCollection(); 

    (employees.Cast<MembershipUser>(). 
     Where(membershipUser => membershipUser.UserName.ToLowerInvariant().Contains(usernameToMatch.ToLowerInvariant()))) 
     .ToList().ForEach(returnFoundUsers.Add); 

    totalRecords = returnFoundUsers.Count; 
    return returnFoundUsers; 
} 

public override MembershipUserCollection GetAllUsers(int pageIndex, int pageSize, out int totalRecords) 
{ 
    if (employees == null) generateUsers(); 
    totalRecords = employees.Count; 
    return employees; 
} 

public override MembershipUser GetUser(string username, bool userIsOnline) 
{ 
    if (employees == null) generateUsers(); 
    IEnumerable<MembershipUser> usersFound = employees.Cast<MembershipUser>().Where(membershipUser => membershipUser.UserName == username); 
    return usersFound.FirstOrDefault(); 
} 

public override MembershipUser GetUser(object providerUserKey, bool userIsOnline) 
{ 
    if (employees == null) generateUsers(); 
    IEnumerable<MembershipUser> usersFound = employees.Cast<MembershipUser>().Where(membershipUser => membershipUser.ProviderUserKey.ToString() == providerUserKey.ToString()); 
    return usersFound.FirstOrDefault(); 
} 

public override string GetUserNameByEmail(string email) 
{ 
    if (employees == null) generateUsers(); 
    IEnumerable<MembershipUser> usersFound = employees.Cast<MembershipUser>().Where(membershipUser => membershipUser.Email.ToLowerInvariant() == email.ToLowerInvariant()); 
    MembershipUser user = usersFound.FirstOrDefault(); 

    if (user != null) 
     return user.UserName; 
    else 
     return null; 
} 

public override MembershipUserCollection FindUsersByEmail(string emailToMatch, int pageIndex, int pageSize, out int totalRecords) 
{ 

    if (employees == null) generateUsers(); 
    MembershipUserCollection returnFoundUsers = new MembershipUserCollection(); 

    (employees.Cast<MembershipUser>(). 
    Where(membershipUser => membershipUser.Email.ToLowerInvariant().Contains(emailToMatch.ToLowerInvariant()))) 
     .ToList().ForEach(returnFoundUsers.Add); 

    totalRecords = returnFoundUsers.Count; 

    return returnFoundUsers; 

} 

public override bool ValidateUser(string username, string password) 
{ 
    //return true; 
    if (employees == null) generateUsers(); 

    IEnumerable<MembershipUser> usersFound = employees.Cast<MembershipUser>().Where(membershipUser => membershipUser.UserName == username); 
    MembershipUser user = usersFound.FirstOrDefault(); 

    if (user != null) 
    { 
     if (string.IsNullOrEmpty(password)) 
     { 
      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 
    else 
     return false; 
} 

}

공용 클래스 LiveRoleProvider를 정의도

string ApplicationName {get; 세트; }

private string[] m_AllRoles = { "Vendor" }; 

private string[,] m_RolesForUser = new string[,] { 
    {"Eyes Wang", "Vendor"}, 
    {"Bruce Li","Vendor"}, 
    {"Jack Chen","Vendor"} 
}; 

public override string[] GetAllRoles() 
{ 

    return m_AllRoles; 

} 

public override string[] GetRolesForUser(string username) 

{ 
    List<string> roles = new List<string>(); 
    for (int i = 0; i <= m_RolesForUser.GetUpperBound(0); i++) 
    { 

     if (m_RolesForUser[i, 0] == username) 
     { 
      roles = m_RolesForUser[i, 1].Split(',').ToList<string>(); 
     } 

    } 
    return roles.ToArray(); 
} 

    public override string[] GetUsersInRole(string rolename) 
    { 

     List<string> users = new List<string>(); 
     for (int i = 0; i <= m_RolesForUser.GetUpperBound(0); i++) 
     { 
      List<string> userRoles = m_RolesForUser[i, 1].Split(',').ToList<string>(); 
      if (userRoles.Where(userRole => userRole == rolename).Count() > 0) 
      { 

      users.Add(m_RolesForUser[i, 0]); 
      } 

     } 
     return users.ToArray(); 
    } 


public override bool IsUserInRole(string username, string rolename) 
{ 

     List<string> usersForRole = GetUsersInRole(rolename).ToList(); 
     if (usersForRole.Where(userName => userName == username).Count() > 0) 
     { 
      return true; 
     } 

     else 
     { 
      return false; 
     } 

} 

public override bool RoleExists(string rolename) 
{ 

    bool roleExsists = m_AllRoles.ToList().Where(roleName => roleName == rolename).Count() > 0; 
    return roleExsists; 
} 

public override string[] FindUsersInRole(string rolename, string usernameToMatch) 
{ 

    List<string> users = GetUsersInRole(rolename).ToList<string>(); 
    List<string> foundUsers = users.Where(userName => userName.ToLowerInvariant().Contains(usernameToMatch.ToLowerInvariant())).ToList<string>(); 
    return foundUsers.ToArray(); 

} } 나는에서는 WA web.config를

<membership defaultProvider="i"> 
    <providers> 
    <add name="i" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthMembershipProvider, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" /> 
    <add name="LiveMembershipProvider" type="SPLiveWebForm.LiveMembershipProvider,SPLiveWebForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34a64026791bbfa4" /> 
    </providers> 
</membership> 
<roleManager defaultProvider="c" enabled="true" cacheRolesInCookie="false"> 
    <providers> 
    <add name="c" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthRoleProvider, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" /> 
    <add name="LiveRoleProvider" type="SPLiveWebForm.LiveRoleProvider,SPLiveWebForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34a64026791bbfa4" /> 
    </providers> 
</roleManager> 
<PeoplePickerWildcards> 
    <clear /> 
    <add key="AspNetSqlMembershipProvider" value="%" /> 
    <add key="LiveMembershipProvider" value="%" /> 
</PeoplePickerWildcards> 

에서

<roleManager> 
     <providers> 
     <add name="LiveRoleProvider" type="SPLiveWebForm.LiveRoleProvider,SPLiveWebForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34a64026791bbfa4" /> 
     </providers> 
    </roleManager> 
    <membership> 
     <providers> 
     <add name="LiveMembershipProvider" type="SPLiveWebForm.LiveMembershipProvider,SPLiveWebForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34a64026791bbfa4" />  
     </providers> 
    </membership> 
    <PeoplePickerWildcards> 
     <clear /> 
     <add key="AspNetSqlMembershipProvider" value="%" /> 
     <add key="LiveMembershipProvider" value="%" /> 
    </PeoplePickerWildcards> 

를 추가

중앙 응용 프로그램의 web.config에서

STS w 기본 로그인 페이지 (http://www.akmii.com/_forms/default.aspx)

를 사용하지만 내 사용자 정의 페이지 (나는 창 사용자 프로필을 사는 얻을 때 다음 추적 방법을 사용하려고 사용하여

<system.web> 
     <membership defaultProvider="i"> 
      <providers> 
      <add name="i" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthMembershipProvider, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" /> 
      <add name="LiveMembershipProvider" type="SPLiveWebForm.LiveMembershipProvider,SPLiveWebForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34a64026791bbfa4" /> 
      </providers> 
     </membership> 
     <roleManager defaultProvider="c" enabled="true" cacheRolesInCookie="false"> 
      <providers> 
      <add name="c" type="Microsoft.SharePoint.Administration.Claims.SPClaimsAuthRoleProvider, Microsoft.SharePoint, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" /> 
      <add name="LiveRoleProvider" type="SPLiveWebForm.LiveRoleProvider,SPLiveWebForm, Version=1.0.0.0, Culture=neutral, PublicKeyToken=34a64026791bbfa4" /> 
      </providers> 
     </roleManager> 
     </system.web> 

내가 성공적으로 포인트를 공유 로그인 할 수 eb.config

는 IIS 한 설정 저장을 검색 할 수 없습니다 :

private void SPUserLogin(string usrName) 
    { 
     string userProviderName = string.Empty; 
     string roleProviderName = string.Empty; 
     foreach (MembershipProvider p in Membership.Providers) 
     { 
      if (p.GetType().Equals(typeof(LiveMembershipProvider))) 
      { 
       userProviderName = p.Name; 
       break; 
      } 
     } 

     foreach (RoleProvider rp in System.Web.Security.Roles.Providers) 
     { 
      if (rp.GetType().Equals(typeof(LiveRoleProvider))) 
      { 
       roleProviderName = rp.Name; 
       break; 
      } 
     } 

     SecurityToken tk = null; 
     try 
     { 
      tk = SPSecurityContext.SecurityTokenForFormsAuthentication(
       new Uri(SPContext.Current.Web.Url), userProviderName, roleProviderName, 
      "Jack Chen", "123", SPFormsAuthenticationOption.PersistentSignInRequest); 
     } 
     catch (Exception e) 
     { 
      Response.Write(e.Message); 
     } 
     if (tk != null) 
     { 
      //try setting the authentication cookie 
      SPFederationAuthenticationModule fam = SPFederationAuthenticationModule.Current; 
      fam.SetPrincipalAndWriteSessionToken(tk); 

      //look for the Source query string parameter and use that as the redirection 
      //string src = Request.QueryString["Source"]; 
      string src = "http://www.akmii.com/_layouts/15/start.aspx#/SitePages/Home.aspx"; 
      if (!string.IsNullOrEmpty(src)) 
       Response.Redirect(src); 
     } 
     else 
     { 

     } 


    } 
} 

는 캐치 섹션에서 던지는 예외가있다) 셰어 로그인하기 ings.Parameter 이름 : 컨텍스트

다음과 같이 오류 스택 :

at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel.ReadResponse(Message response) 
    at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel.Issue(RequestSecurityToken rst, RequestSecurityTokenResponse& rstr) 
    at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustChannel.Issue(RequestSecurityToken rst) 
    at Microsoft.SharePoint.SPSecurityContext.SecurityTokenForContext(Uri context, Boolean bearerToken, SecurityToken onBehalfOf, SecurityToken actAs, SecurityToken delegateTo, SPRequestSecurityTokenProperties properties) 
    at Microsoft.SharePoint.SPSecurityContext.SecurityTokenForFormsAuthentication(Uri context, String membershipProviderName, String roleProviderName, String username, String password, SPFormsAuthenticationOption options) 
    at SPLiveWebForm.Layouts.SPLiveWebForm.Login.SPUserLogin(String usrName) 

내가

bool status = SPClaimsUtility.AuthenticateFormsUser(
        new Uri(SPContext.Current.Web.Url), 
        usrName, 
        "123"); 

를 사용하는 경우 같은 예외가 던져.

at Microsoft.SharePoint.IdentityModel.SPFormsOriginalIssuerBuilder.GetFormsAuthenticationProviderFromContext(Uri context) 
    at Microsoft.SharePoint.IdentityModel.SPFormsOriginalIssuerBuilder.ValidateFormsAuthProviderNames(Uri context, String membershipProvider, String roleProvider) 
    at Microsoft.SharePoint.IdentityModel.SPFormsOriginalIssuerBuilder.SetProviderNames() 
    at Microsoft.SharePoint.IdentityModel.SPSecurityTokenService.SPRequestInfo.InitializeForForms(SPRequestSecurityToken request) 
    at Microsoft.SharePoint.IdentityModel.SPSecurityTokenService.GetTokenLifetime(Lifetime requestLifetime) 
    at Microsoft.IdentityModel.SecurityTokenService.SecurityTokenService.Issue(IClaimsPrincipal principal, RequestSecurityToken request) 
    at Microsoft.SharePoint.IdentityModel.SPSecurityTokenService.Issue(IClaimsPrincipal principal, RequestSecurityToken request) 
    at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.DispatchRequest(DispatchContext dispatchContext) 
    at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.ProcessCore(Message requestMessage, WSTrustRequestSerializer requestSerializer, WSTrustResponseSerializer responseSerializer, String requestAction, String responseAction, String trustNamespace) 
    at Microsoft.IdentityModel.Protocols.WSTrust.WSTrustServiceContract.ProcessTrust13Issue(Message message) 
    at SyncInvokeProcessTrust13Issue(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

나는 하루 종일이 문제를 파고 들지만 실패했습니다.

해결 방법이 있습니까?

많은 감사!

빈센트

답변

1

나는 동일한 문제가있었습니다. 필자의 경우 Central Administartion => 시스템 설정 => 대체 액세스 매핑 구성으로 이동해야했습니다.

"공용 URL 편집"을 클릭하고 "대체 액세스 매핑 모음"에서 자신의 응용 프로그램을 선택한 다음 "인터넷"텍스트 상자를 채우십시오. 어떤 값이 정확한지 잘 모르겠지만 기본 (80) 포트가 포함 된 공유 지점 URL로 입력했습니다.

희망이 있으면 도움이됩니다.