【ASP.NET】UCenter实现多站点同步登录退出

利用UCenter实现discuz论坛和应用网站同步登录和退出功能
测试环境:Discuz! X3.2UCenter 1.6.Net Framework 4.0

进入Discuz 后台的UCenter应用管理页面

【ASP.NET】UCenter实现多站点同步登录退出_第1张图片
UCenter

添加新应用

安装方式选择自定义安装、应用类型为其他。通信密钥可以自定义。开启同步登录和通知

【ASP.NET】UCenter实现多站点同步登录退出_第2张图片
添加新应用

集成UCenter API For DotNet

【ASP.NET】UCenter实现多站点同步登录退出_第3张图片
UC配置信息

把DS.Web.UCenter添加到项目中
修改项目App.Config配置信息:
UC_KEY 添加新应用时填写的通信密钥
UC_API UCenter地址
UC_APPID 应用网站在UCenter中的id

配置完毕后将网站运行起来,刷新一下应用列表界面

【ASP.NET】UCenter实现多站点同步登录退出_第4张图片
通信成功

如果上述配置信息正确,就可以看到应用通信成功了。

调用UCenter API

以登录为例,实例化一个UcClient对象,调用UserLogin方法

IUcClient client = new UcClient();
var user = client.UserLogin("admin", "admin"); //登陆
if (user.Success) //判断是否登陆成功
{
    client.PmSend(0, 0, "公告", "测试公告", user.Uid); //给该用户发送系统消息
}

其他相关的API

using System.Collections.Generic;

namespace DS.Web.UCenter.Client
{
    ///
    /// UcApi客户端
    ///
    public interface IUcClient
    {
        /// 
        /// 用户注册
        /// 
        /// 用户名
        /// 密码
        /// Email
        /// 登陆问题
        /// 答案
        /// 
        UcUserRegister UserRegister(string userName, string passWord, string email, int questionId = 0, string answer = "");

        /// 
        /// 用户登陆
        /// 
        /// 用户名/Uid/Email
        /// 密码
        /// 登录方式
        /// 需要登陆问题
        /// 问题ID
        /// 答案
        /// 
        UcUserLogin UserLogin(string userName, string passWord, LoginMethod loginMethod = LoginMethod.UserName, bool checkques = false, int questionId = 0, string answer = "");

        /// 
        /// 得到用户信息
        /// 
        /// 用户名
        /// 
        UcUserInfo UserInfo(string userName);

        /// 
        /// 得到用户信息
        /// 
        /// Uid
        /// 
        UcUserInfo UserInfo(int uid);

        /// 
        /// 更新用户信息
        /// 更新资料需验证用户的原密码是否正确,除非指定 ignoreoldpw 为 1。
        /// 如果只修改 Email 不修改密码,可让 newpw 为空;
        /// 同理如果只修改密码不修改 Email,可让 email 为空。
        /// 
        /// 
        UcUserEdit UserEdit(string userName, string oldPw, string newPw, string email, bool ignoreOldPw = false, int questionId = 0, string answer = "");

        /// 
        /// 删除用户
        /// 
        /// Uid
        /// 
        bool UserDelete(params int[] uid);

        /// 
        /// 删除用户头像
        /// 
        /// Uid
        void UserDeleteAvatar(params int[] uid);

        /// 
        /// 同步登陆
        /// 
        /// Uid
        /// 同步登陆的 Html 代码
        string UserSynlogin(int uid);

        /// 
        /// 同步登出
        /// 
        /// 同步登出的 Html 代码
        string UserSynLogout();

        /// 
        /// 检查 Email 格式
        /// 
        /// Email
        /// 
        UcUserCheckEmail UserCheckEmail(string email);

        /// 
        /// 增加受保护用户
        /// 
        /// 操作管理员
        /// 用户名
        /// 
        bool UserAddProtected(string admin, params string[] userName);

        /// 
        /// 删除受保护用户
        /// 
        /// 操作管理员
        /// 用户名
        /// 
        bool UserDeleteProtected(string admin, params string[] userName);

        /// 
        /// 得到受保护用户
        /// 
        /// 
        UcUserProtecteds UserGetProtected();

        /// 
        /// 合并用户
        /// 
        /// 老用户名
        /// 新用户名
        /// Uid
        /// 密码
        /// Email
        /// 
        UcUserMerge UserMerge(string oldUserName, string newUserName, int uid, string passWord, string email);

        /// 
        /// 移除重名用户记录
        /// 
        /// 用户名
        void UserMergeRemove(string userName);

        /// 
        /// 得到用户积分
        /// 
        /// 应用程序Id
        /// Uid
        /// 积分编号
        /// 
        int UserGetCredit(int appId, int uid, int credit);

        /// 
        /// 检查新消息
        /// 
        /// Uid
        /// 
        UcPmCheckNew PmCheckNew(int uid);

        /// 
        /// 发送短消息
        /// 
        /// 发件人用户 ID,0 为系统消息
        /// 回复的消息 ID,0:发送新的短消息,大于 0:回复指定的短消息
        /// 消息标题
        /// 消息内容
        /// 收件人ID
        /// 
        UcPmSend PmSend(int fromUid, int replyPmId, string subject, string message, params int[] msgTo);

        /// 
        /// 发送短消息
        /// 
        /// 发件人用户 ID,0 为系统消息
        /// 回复的消息 ID,0:发送新的短消息,大于 0:回复指定的短消息
        /// 消息标题
        /// 消息内容
        /// 收件人用户名
        /// 
        UcPmSend PmSend(int fromUid, int replyPmId, string subject, string message, params string[] msgTo);

        /// 
        /// 删除短消息
        /// 
        /// Uid
        /// 文件夹
        /// 短消息ID
        /// 删除的数量
        int PmDelete(int uid, PmDeleteFolder folder, params int[] pmIds);

        /// 
        /// 删除会话
        /// 
        /// 发件人
        /// 收件人
        /// 删除的数量
        int PmDelete(int uid, params int[] toUids);

        /// 
        /// 修改阅读状态
        /// 
        /// 发件人
        /// 收件人
        /// 短消息ID
        /// 阅读状态
        void PmReadStatus(int uid, int toUids, int pmIds = 0, ReadStatus readStatus = ReadStatus.Readed);

        /// 
        /// 修改阅读状态
        /// 
        /// 发件人
        /// 收件人数组
        /// 短消息ID数组
        /// 阅读状态
        void PmReadStatus(int uid, IEnumerable toUids, IEnumerable pmIds, ReadStatus readStatus = ReadStatus.Readed);

        /// 
        /// 获取短消息列表
        /// 
        /// Uid
        /// 当前页编号,默认值 1
        /// 每页最大条目数,默认值 10
        /// 短消息所在的文件夹
        /// 过滤方式
        /// 截取短消息内容文字的长度,0 为不截取,默认值 0
        /// 
        UcPmList PmList(int uid, int page = 1, int pageSize = 10, PmReadFolder folder = PmReadFolder.NewBox, PmReadFilter filter = PmReadFilter.NewPm, int msgLen = 0);

        /// 
        /// 获取短消息内容
        /// 本接口函数用于返回指定用户的指定消息 ID 的消息,返回的数据中包含针对这个消息的回复。
        /// 如果指定 touid 参数,那么短消息将列出所有 uid 和 touid 之间的短消息,daterange 可以指定返回消息的日期范围。
        /// 
        /// Uid
        /// 短消息ID
        /// 收件人ID
        /// 日期范围
        /// 
        UcPmView PmView(int uid, int pmId, int toUid = 0, DateRange dateRange = DateRange.Today);

        /// 
        /// 获取单条短消息内容
        /// 
        /// Uid
        /// 类型
        /// 短消息ID
        /// 
        UcPm PmViewNode(int uid, ViewType type = ViewType.Specified, int pmId = 0);

        /// 
        /// 忽略未读消息提示
        /// 
        /// Uid
        void PmIgnore(int uid);

        /// 
        /// 得到黑名单
        /// 
        /// Uid
        /// 
        UcPmBlacklsGet PmBlacklsGet(int uid);

        /// 
        /// 设置黑名单为禁止所有人(清空原数据)
        /// 
        /// Uid
        /// 
        bool PmBlacklsSetAll(int uid);

        /// 
        /// 设置黑名单(清空原数据)
        /// 
        /// Uid
        /// 黑名单用户名
        /// 
        bool PmBlacklsSet(int uid, params string[] userName);

        /// 
        /// 添加黑名单为禁止所有人
        /// 
        /// Uid
        /// 
        bool PmBlacklsAddAll(int uid);

        /// 
        /// 增加黑名单
        /// 
        /// Uid
        /// 黑名单用户名
        /// 
        bool PmBlacklsAdd(int uid, params string[] userName);

        /// 
        /// 删除黑名单中的禁止所有人
        /// 
        /// Uid
        /// 
        void PmBlacklsDeleteAll(int uid);

        /// 
        /// 删除黑名单
        /// 
        /// Uid
        /// 黑名单用户名
        void PmBlacklsDelete(int uid, params string[] userName);

        /// 
        /// 增加好友
        /// 
        /// Uid
        /// 好友ID
        /// 备注
        /// 
        bool UcFriendAdd(int uid, int friendId, string comment = "");

        /// 
        /// 删除好友
        /// 
        /// Uid
        /// 好友ID
        /// 
        bool UcFriendDelete(int uid, params int[] friendIds);

        /// 
        /// 获取好友总数
        /// 
        /// Uid
        /// 方向
        /// 好友数目
        int UcFriendTotalNum(int uid, FriendDirection direction = FriendDirection.All);

        /// 
        /// 好友列表
        /// 
        /// Uid
        /// 当前页编号
        /// 每页最大条目数
        /// 好友总数
        /// 方向
        /// 
        UcFriends UcFriendList(int uid, int page = 1, int pageSize = 10, int totalNum = 10, FriendDirection direction = FriendDirection.All);

        /// 
        /// 积分兑换请求
        /// 
        /// Uid
        /// 原积分
        /// 目标积分
        /// 目标应用ID
        /// 积分数额
        /// 
        bool UcCreditExchangeRequest(int uid, int from, int to, int toAppId, int amount);

        ///
        /// 修改头像
        ///
        ///Uid
        ///
        ///
        string Avatar(int uid, AvatarType type = AvatarType.Virtual);

        /// 
        /// 得到头像地址
        /// 
        /// Uid
        /// 大小
        /// 类型
        /// 
        string AvatarUrl(int uid,AvatarSize size,AvatarType type = AvatarType.Virtual);

        /// 
        /// 检查头像是否存在
        /// 
        /// 
        /// 
        /// 
        /// 
        bool AvatarCheck(int uid, AvatarSize size = AvatarSize.Middle, AvatarType type = AvatarType.Virtual);

        /// 
        /// 获取标签数据
        /// 
        /// 标签名
        /// 应用程序ID对应的数量
        /// 
        UcTags TagGet(string tagName, IEnumerable> number);

        /// 
        /// 添加事件
        /// 
        /// 图标类型,如:thread、post、video、goods、reward、debate、blog、album、comment、wall、friend
        /// Uid
        /// 用户名
        /// 标题模板
        /// 标题数据数组
        /// 内容模板
        /// 模板数据
        /// 相同事件合并时用到的数据:特定的数组,只有两项:name、link,保留
        /// 保留
        /// 相关图片的 URL 和链接地址。一个图片地址,一个链接地址
        /// 
        int FeedAdd(FeedIcon icon, int uid, string userName, string titleTemplate, string titleData, string bodyTemplate, string bodyData, string bodyGeneral, string targetIds, params string[] images);

        /// 
        /// 得到Feed
        /// 
        /// 数量限制
        /// 
        UcFeeds FeedGet(int limit);

        /// 
        /// 得到应用列表
        /// 
        /// 
        UcApps AppList();

        /// 
        /// 添加邮件到队列
        /// 
        /// 标题
        /// 内容
        /// Uid
        /// 
        UcMailQueue MailQueue(string subject, string message,params int[] uids);

        /// 
        /// 添加邮件到队列
        /// 
        /// 标题
        /// 内容
        /// 目标Email
        /// 
        UcMailQueue MailQueue(string subject, string message, params string[] emails);

        /// 
        /// 添加邮件到队列
        /// 
        /// 标题
        /// 内容
        /// Uid
        /// 目标email
        /// 
        UcMailQueue MailQueue(string subject, string message, int[] uids, string[] emails);

        /// 
        /// 添加邮件到队列
        /// 
        /// 标题
        /// 内容
        /// 发信人,可选参数,默认为空,uc后台设置的邮件来源作为发信人地址
        /// 邮件字符集,可选参数,默认为gbk
        /// 是否是html格式的邮件,可选参数,默认为FALSE,即文本邮件
        /// 邮件级别,可选参数,默认为1,数字大的优先发送,取值为0的时候立即发送,邮件不入队列
        /// Uid
        /// 目标email
        /// 
        UcMailQueue MailQueue(string subject,string message,string fromMail,string charset,bool htmlOn,int level,int[] uids,string[] emails);
    }
}

供UCenter调用的接口

在站点新建一个路径为/API/uc.ashx的文件 (文件夹名称要大写)
添加以下代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DS.Web.UCenter.Api;

namespace DS.Web.UCenter.Website.API
{
    /// 
    /// Summary description for uc
    /// 
    public class uc:UcApiBase
    {
        // 用户被删除
        public override ApiReturn DeleteUser(IEnumerable ids)
        {
            throw new NotImplementedException();
        }

        // 修改了用户名
        public override ApiReturn RenameUser(int uid, string oldUserName, string newUserName)
        {
            throw new NotImplementedException();
        }

        public override UcTagReturns GetTag(string tagName)
        {
            throw new NotImplementedException();
        }

        // 同步登录
        public override ApiReturn SynLogin(int uid)
        {
            throw new NotImplementedException();
        }

        // 同步退出
        public override ApiReturn SynLogout()
        {
            throw new NotImplementedException();
        }

        // 密码更新
        public override ApiReturn UpdatePw(string userName, string passWord)
        {
            throw new NotImplementedException();
        }

        public override ApiReturn UpdateBadWords(UcBadWords badWords)
        {
            throw new NotImplementedException();
        }

        public override ApiReturn UpdateHosts(UcHosts hosts)
        {
            throw new NotImplementedException();
        }

        public override ApiReturn UpdateApps(UcApps apps)
        {
            throw new NotImplementedException();
        }

        public override ApiReturn UpdateClient(UcClientSetting client)
        {
            throw new NotImplementedException();
        }

        public override ApiReturn UpdateCredit(int uid, int credit, int amount)
        {
            throw new NotImplementedException();
        }

        public override UcCreditSettingReturns GetCreditSettings()
        {
            throw new NotImplementedException();
        }

        public override ApiReturn GetCredit(int uid, int credit)
        {
            throw new NotImplementedException();
        }

        public override ApiReturn UpdateCreditSettings(UcCreditSettings creditSettings)
        {
            throw new NotImplementedException();
        }
    }
}

这些是提供给UCenter调用的接口,例如当用户在discuz登录时,UCenter会发送一个通知(请求uc.ashx),把登录的用户uid等信息传递过来,我们要做的就是在自己的SynLogin中写登录的cookie或session等操作。
同时,在SynLogout中加上清除cookie和session的处理。就实现了同步登录和退出功能。

注意点

  • 添加应用时一定要勾选 开启同步登录接受通知
  • 需要正确填写UC各项必填的配置信息
  • 确保在bbs站点存在/uc_client/data/cache/apps.php文件,没有的话从/uc_server/data/cache/apps.php拷贝一份
  • 要将上述配置信息放到站点的Web.config

同步注册

如果你的网站还需要同步注册功能,请参考[【ASP.Net】UCenter实现多站点同步登录退出】(http://www.jianshu.com/p/1caa425ef24b)

你可能感兴趣的:(【ASP.NET】UCenter实现多站点同步登录退出)