我有什么?
我已经在其中一个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/