Проблема двойной аутентификации FBA - PullRequest
3 голосов
/ 06 августа 2011

Что у меня есть?

Я настроил FBA в одном из веб-приложений, при этом на странице входа в систему есть раскрывающийся список для выбора входа в Windows или FBA.Все работает нормально.

Что я хочу?

Я хочу иметь пользовательскую страницу входа с текстовыми полями для имени пользователя и пароля и кнопку входа, которая будет использоватьсядля аутентификации пользователей Windows и FBA.Чтобы различать два разных входа в систему, я хочу обработать событие OnAuthenticate и проверить, содержит ли имя пользователя '\', а затем предположить, что это пользователь Windows, в противном случае это пользователь FBA.

Это код, написанный наОбработчик события OnAuthenticate:

protected void signinControl_Authenticate(object sender, AuthenticateEventArgs e)
{
    string fullUserName = signinControl.UserName;
    string username = null;

    if (fullUserName.Contains("\\")) //Windows user
    {
        string domain = fullUserName.Substring(0, fullUserName.IndexOf("\\"));
        using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain))
        {
            username = fullUserName.Substring(fullUserName.IndexOf("\\") + 1);
            e.Authenticated = pc.ValidateCredentials(username, signinControl.Password);
        }
    }
    else //FBA user
    {
        e.Authenticated = Membership.ValidateUser(fullUserName, signinControl.Password);
    }
}

С какой проблемой я столкнулся?

Приведенный выше код хорошо работает для пользователей FBA.Но, когда я пытаюсь войти в систему с пользователем Windows, хотя e.Authenticated установлен после проверки true, он выдает следующее сообщение об ошибке: «Ваша попытка входа не удалась. Пожалуйста, попробуйте еще раз.».

e.Authenticated = pc.ValidateCredentials(username, signinControl.Password);

Я считаю, что установка e.Authenticated в true должна перенаправить пользователя со страницы входа на запрошенную страницу.Может ли кто-нибудь помочь мне, если я должен сделать что-нибудь еще, чтобы пользователь Windows вошел в систему?

Update-1 :

Я использовал SetAuthCookie() метод для установки Cookieявно, все тот же результат.

FormsAuthentication.SetAuthCookie(username, true);

1 Ответ

0 голосов
/ 27 марта 2012

Вы должны использовать метод ниже для форм пользователя

SPClaimsUtility.AuthenticateFormsUser(
                Context.Request.UrlReferrer,
                UserName.Text, 
                Password.Text);

, и часть окна объявляется так:

protected void lbInternalUsers_OnClick(object sender, EventArgs e)
    {
        try
        {
            if (null != SPContext.Current && null != SPContext.Current.Site)
            {
                SPIisSettings iisSettings = SPContext.Current.Site.WebApplication.IisSettings[SPUrlZone.Default];
                if (null != iisSettings && iisSettings.UseWindowsClaimsAuthenticationProvider)
                {
                    SPAuthenticationProvider provider = iisSettings.WindowsClaimsAuthenticationProvider;
                    Redirect(provider);
                }
            }
        }
        catch (Exception ex)
        {
            lblError.Text = ex.Message;
        }
    }

    private void Redirect(SPAuthenticationProvider provider)
    {
        string comp = HttpContext.Current.Request.Url.GetComponents(UriComponents.Query, UriFormat.SafeUnescaped);
        string url = provider.AuthenticationRedirectionUrl.ToString();
        if (provider is SPWindowsAuthenticationProvider)
        {
            comp = EnsureUrl(comp, true);
        }

        SPUtility.Redirect(url, SPRedirectFlags.Default, this.Context, comp);
    }

    private string EnsureUrl(string url, bool urlIsQueryStringOnly)
    {
        if (!url.Contains("ReturnUrl="))
        {
            if (urlIsQueryStringOnly)
            {
                url = url + (string.IsNullOrEmpty(url) ? "" : "&");
            }
            else
            {
                url = url + ((url.IndexOf('?') == -1) ? "?" : "&");
            }
            url = url + "ReturnUrl=";
        }
        return url;
    }

, как подробно описано здесь в справке

...