首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FBA对偶认证问题

FBA对偶认证问题
EN

Stack Overflow用户
提问于 2011-08-06 07:44:25
回答 1查看 1.5K关注 0票数 3

我有什么?

我已经在一个web应用程序中配置了FBA,该应用程序中包含有下拉框的开箱即用的登录页面,可以选择窗口或FBA登录。一切都很好。

我想要什么?

我希望有一个自定义登录页面,包含用户名和密码的文本框和一个登录按钮,用于验证Windows和FBA用户。为了区分这两个不同的登录,我想处理OnAuthenticate事件,并检查用户名是否包含'\‘,然后假设它是Windows,否则它就是FBA用户。

这是在OnAuthenticate事件处理程序中编写的代码:

代码语言:javascript
复制
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,结果仍然相同。

代码语言:javascript
复制
FormsAuthentication.SetAuthCookie(username, true);
EN

回答 1

Stack Overflow用户

发布于 2012-03-27 19:22:02

您应该对窗体用户使用下面的方法

代码语言:javascript
复制
SPClaimsUtility.AuthenticateFormsUser(
                Context.Request.UrlReferrer,
                UserName.Text, 
                Password.Text);

windows部分声明如下:

代码语言:javascript
复制
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;
    }

参考文献中详细介绍的那样

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6965493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档