我有什么?
我已经在其中一个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);
答案 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;
}