FBA双重身份验证问题

时间:2011-08-06 07:44:25

标签: sharepoint-2010 fba

我有什么?

我已经在其中一个Web应用程序中配置了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用户登录,有人可以帮助我吗?

更新-1

我使用SetAuthCookie()方法明确设置Cookie,结果仍然相同。

FormsAuthentication.SetAuthCookie(username, true);

1 个答案:

答案 0 :(得分:0)

您应该使用以下方法表单用户

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;
    }

详见reference