1

Я работаю над небольшим проектом для SharePoint 2010, который позволит пользователям аутентифицироваться с помощью OpenID (и, возможно, более позднего).Аутентификация пользователей без пароля в SharePoint 2010

Как это работает в настоящее время? У меня есть поставщик членства и роли на основе SQL. Моя страница входа использует DotNetOpenAuth для отправки запроса подлинности в конечную точку OpenID. Если я получу положительный ответ, я прочитаю адрес электронной почты из персоны OpenID и создаю сеанс для члена MembershipUser, который имеет этот адрес электронной почты (если я знаю конечную точку, из которой он был). Если этого пользователя не существует, я создаю новый MemberhipUser и сохраняю конечную точку в свойстве comment (чтобы вы не могли просто редактировать свою личность для входа в систему как адрес электронной почты другого человека).

Это работает, но проблема заключается в создании сеанса. Я в настоящее время сделать это с помощью следующего фрагмента кода:

//authenticate 
SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication(new Uri(SPContext.Current.Web.Url),userProvider,roleProvider,username,user.GetPassword());   
SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token); 

Но этот бит работает только, если поставщик членства не шифрует пароли, потому что, как только в зашифрованном виде, я не могу просто прочитать пароль пользователя и использовать его в это способ.

Я надеялся найти способ просто войти в систему, но я не могу найти простой способ сделать это.

Использование

FormsAuthentication.SetAuthCookie(username, false); 

Просто создает исключение (я предполагаю, что это потому, что метод для стандартного FBA, а не на основе утверждений FBA но я просто угадываю. Встроенный FBA контроля входа в систему с имя пользователя и пароль работает, хотя.)

System.ArgumentException: Exception of type 'System.ArgumentException' was thrown. Parameter name: encodedValue 
at Microsoft.SharePoint.Administration.Claims.SPClaimEncodingManager.DecodeClaimFromFormsSuffix(String encodedValue)  
at Microsoft.SharePoint.Administration.Claims.SPClaimProviderManager.GetProviderUserKey(String encodedSuffix)  
at Microsoft.SharePoint.SPGlobal.CreateSPRequestAndSetIdentity(SPSite site, String name, Boolean bNotGlobalAdminCode, String strUrl, Boolean bNotAddToContext, Byte[] UserToken, String userName, Boolean bIgnoreTokenTimeout, Boolean bAsAnonymous)  
at Microsoft.SharePoint.SPWeb.InitializeSPRequest()  
at Microsoft.SharePoint.WebControls.SPControl.EnsureSPWebRequest(SPWeb web)  
at Microsoft.SharePoint.WebControls.SPControl.SPWebEnsureSPControl(HttpContext context)  
at Microsoft.SharePoint.ApplicationRuntime.BaseApplication.Application_PreRequestHandlerExecute(Object sender, EventArgs e)  
at Microsoft.SharePoint.ApplicationRuntime.SPRequestModule.PreRequestExecuteAppHandler(Object oSender, EventArgs ea)  
at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()  
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) 

Короче говоря, я хотел бы способ создать маркеры для своих членов без необходимости использовать свой пароль.

У кого-нибудь есть опыт в этом или представление о том, как я могу получить то, что хочу?

Заранее спасибо.

ответ

1

В случае, если кто-то другой столкнется с такой же ситуацией, я скажу, как я «решил» проблему.

В профессиональной среде вы, скорее всего, создадите свою собственную службу членства в поставщике/службе токена, чтобы вы могли запрашивать токены в своем коде, не требуя пароля пользователя.

В моем случае (из-за ограничений по времени) я не мог этого сделать, поэтому я сделал более простой выход. Вместо использования зашифрованных паролей (через IIS) я использовал hashed паролей (устанавливается вручную в файле web.config). Я также позаботился, чтобы разрешить сброс паролей для моего поставщика членства. Тогда я использовал следующий код, чтобы выдать маркер:

MembershipUser user = membershipProvider.GetUser(username, true); 
if(user == null) 
{ 
    //create new user here 
} 
string password = user.ResetPassword(); 
SecurityToken token = SPSecurityContext.SecurityTokenForFormsAuthentication(new Uri(SPContext.Current.Web.Url), membershipProviderName, roleProviderName, user.UserName, password, false); 
SPFederationAuthenticationModule.Current.SetPrincipalAndWriteSessionToken(token);    

Практически, это означает, что пользователь формы имеет свой пароль сбросить каждый раз, когда я вхожу его, но так как он фактически никогда использует свой пароль, это не так большой вопрос. Он работает достаточно хорошо, чтобы быстро показывать поддержку OpenID в SharePoint.

Смежные вопросы