我有什么?
我已经在一个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);发布于 2012-03-27 19:22:02
您应该对窗体用户使用下面的方法
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;
}如参考文献中详细介绍的那样
https://stackoverflow.com/questions/6965493
复制相似问题