我有什么?

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

Update-1 :

我使用SetAuthCookie()方法显式设置Cookie,结果仍然相同。
FormsAuthentication.SetAuthCookie(username, true);

最佳答案

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

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

Windows部分的声明如下:
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所述

关于sharepoint-2010 - FBA双重身份验证问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6965493/

10-14 17:21