我迫切需要为 SP2010 站点创建自定义登录页面。现在,我知道这可以通过基于声明的身份验证和 FBA 来完成,但是经过几天的工作,我无法完成,所以我转向了另一种方法。
也许我可以用 .NET 创建一个前端网站,它会欢迎用户并进行身份验证。然后也许我可以为我的 SP2010 站点设置一个“会话状态”,然后将用户重定向到 sp2010 站点。我不知道这是否可能,但我想学习。
我愿意接受其他为 SP2010 创建自定义登录页面的建议。
提前致谢。
我迫切需要为 SP2010 站点创建自定义登录页面。现在,我知道这可以通过基于声明的身份验证和 FBA 来完成,但是经过几天的工作,我无法完成,所以我转向了另一种方法。
也许我可以用 .NET 创建一个前端网站,它会欢迎用户并进行身份验证。然后也许我可以为我的 SP2010 站点设置一个“会话状态”,然后将用户重定向到 sp2010 站点。我不知道这是否可能,但我想学习。
我愿意接受其他为 SP2010 创建自定义登录页面的建议。
提前致谢。
从长远来看,我认为您最好提出可以解决您的 CBA 和 FBA 问题的问题,而不是拼凑一个自定义的单点登录解决方法。
您好我必须能够在 SharePoint 2007 中从移动设备验证用户,并且我想创建某种自定义登录。
可能有比这更容易/更好的方法来做到这一点,但我首先对 SharePoint 网站做了类似的事情,然后我必须检查活动目录。
(用户对象是 WCF 上的某种加密数据,但基本上给出了用户名和密码)
/// <summary>
/// Authenticate whether the user is a user of SharePoint by their username and password
/// </summary>
/// <param name="LoggedIn">The user that is to be authenticated</param>
/// <param name="SharePointSiteAddress">The address of the SharePoint site</param>
/// <returns>The name of the user if they are authenticated or null if not</returns>
public string AuthenticateSharePointUser_UsePassword(User LoggedIn, string SharePointSiteAddress)
{
string nameResult = null;
try
{
Authentication authentication = new Authentication();
//Check against active directory first
bool isAuthenticated = authentication.AuthenticateUserActiveDirectory(LoggedIn.GetUserName(), LoggedIn.GetPassword());
if (isAuthenticated)
{
nameResult = authentication.AuthenticateSharePointUserName(LoggedIn.GetUserName(), SharePointSiteAddress);
}
}
catch (Exception ex)
{
throw new Exception("Authentication Error", ex);
}
return nameResult;
}
/// <summary>
/// Authenticate that a user exists on SharePoint
/// </summary>
/// <param name="UserName">The username of the user to check</param>
/// <param name="SiteAddress">The address of the site to check user on</param>
/// <returns>The name of the user or null if not</returns>
public string AuthenticateSharePointUserName(string UserName, string SiteAddress)
{
string user = null;
//Open up the site and get the list
using (SPSite site = new SPSite(SiteAddress))
{
using (SPWeb web = site.OpenWeb())
{
try
{
user = web.AllUsers[GetFullDomainUserName(UserName)].Name;
}
catch (Exception)
{
//Swallow exception from the user not existing
user = null;
}
}
}
return user;
}
/// <summary>
/// Authenticate the user against active directory
/// </summary>
/// <param name="UserName">The username that can include the domain name domain\username or just username</param>
/// <param name="Password">The password</param>
/// <returns>Whether the user has been authenticated</returns>
public bool AuthenticateUserActiveDirectory(string UserName, string Password)
{
//Split on the domain name e.g. domain\...
string[] splitUserName = GetFullDomainUserName(UserName).Split('\\');
PrincipalContext context = null;
bool authenticated = false;
//Provide user domain if there is one to validate against or use current domain thread is running on
context = new PrincipalContext(ContextType.Domain, splitUserName[0]);
//Now validate against active directory
using (context)
{
authenticated = context.ValidateCredentials(splitUserName[1], Password);
}
return authenticated;
}
/// <summary>
/// Get a full domain name inclusive username from username given
/// if there is not already a domain name in it then attach current domain on this machine
/// </summary>
/// <param name="UserName">The username provided by user</param>
/// <returns>User name in style e.g. domain\----</returns>
public static string GetFullDomainUserName(string UserName)
{
//Split on the domain name e.g. net\356789
string[] splitUserName = UserName.Split('\\');
//If the user gave a domain name then use that domain else use the current domain
if (splitUserName.Length <= 1)
{
splitUserName = new string[] { Environment.UserDomainName, UserName };
}
return string.Join("\\", splitUserName);
}