利用UCenter实现discuz论坛和应用网站同步登录和退出功能
测试环境:Discuz! X3.2
、UCenter 1.6
、.Net Framework 4.0
进入Discuz 后台的UCenter应用管理页面
添加新应用
安装方式选择自定义安装、应用类型为其他。通信密钥可以自定义。开启同步登录和通知
集成UCenter API For DotNet
把DS.Web.UCenter添加到项目中
修改项目App.Config
配置信息:
UC_KEY
添加新应用时填写的通信密钥
UC_API
UCenter地址
UC_APPID
应用网站在UCenter中的id
配置完毕后将网站运行起来,刷新一下应用列表界面
如果上述配置信息正确,就可以看到应用通信成功了。
调用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)