0

我迫切需要为 SP2010 站点创建自定义登录页面。现在,我知道这可以通过基于声明的身份验证和 FBA 来完成,但是经过几天的工作,我无法完成,所以我转向了另一种方法。

也许我可以用 .NET 创建一个前端网站,它会欢迎用户并进行身份验证。然后也许我可以为我的 SP2010 站点设置一个“会话状态”,然后将用户重定向到 sp2010 站点。我不知道这是否可能,但我想学习。

我愿意接受其他为 SP2010 创建自定义登录页面的建议。

提前致谢。

4

2 回答 2

1

从长远来看,我认为您最好提出可以解决您的 CBA 和 FBA 问题的问题,而不是拼凑一个自定义的单点登录解决方法。

于 2011-01-31T15:20:35.217 回答
0

您好我必须能够在 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);
    }
于 2011-01-30T17:46:20.277 回答