안녕하세요 저는 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);
}