3

我有的?

我已经在其中一个 Web 应用程序中配置了 FBA,开箱即用的登录页面具有下拉框来选择窗口或 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);
4

1 回答 1

0

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

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

参考中所述

于 2012-03-27T19:22:02.547 回答