使用WCF RIA Service中的Authentication进行自定义验证
不少文章有提到怎样使用WCF RIA Service中的验证功能,但一般都是以建立一个SilverLight Business Application项目作为开始,然而SilverLight Business Application的模板并不是那么符合实际需要,默认添加了一堆的类、方法,在这个基础上去调整,实在恶心,故实验了一下在普通的SilverLight项目中使用。现总结如下:
1、建立一个普通的SilverLight项目,选中“Enable WCF RIA Service”,假设项目SL项目名为MyAuthentication,对应WEB项目为MyAuthentication.Web;
2、在MyAuthentication.Web项目中添加一项:Authentication Domain Service,使用"Authentication Domain Service"项目文件模板将自动添加一个继承自AuthenticationBase<T>的类,一个继承自UserBase的User类,假设继承自AuthenticationBase<T>的类名为AuthenticationDomainService;
3、编译解决方案,编译成功后将在SL项目中生成类:AuthenticationDomainContext、WebContext、User;
接下来就可以做验证功能了。在AuthenticationDomainService类中重载ValidateUser方法可实现自定义验证,重载GetAuthenticatedUser方法可实现自定义加载当前登录用户信息。
4、扩展User类,重载ValidateUser、GetAuthenticatedUser方法:
[EnableClientAccess]
public class AuthenticationDomainService : AuthenticationBase<User>
{
// To enable Forms/Windows Authentication for the Web Application, edit the appropriate section of web.config file.
protected override bool ValidateUser(string userName, string password)
{
return userName == "zhangsan" && password == "123456";
}
protected override User GetAuthenticatedUser(IPrincipal principal)
{
return new User() { Name = principal.Identity.Name, DisplayName = "张三" };
//return base.GetAuthenticatedUser(principal);
}
}
public class User : UserBase
{
// NOTE: Profile properties can be added here
// To enable profiles, edit the appropriate section of web.config file.
// public string MyProfileProperty { get; set; }
public User()
: base()
{
}
public string DisplayName { get; internal set; }
}
编译后貌似就可以在SL项目中使用WebContext了,其实不然。还需要做以下准备工作:
5、在SL的App类的构造函数中加上WebContext初始化代码:
WebContext webContext = new WebContext();
webContext.Authentication = new FormsAuthentication();
//webContext.Authentication = new WindowsAuthentication();
this.ApplicationLifetimeObjects.Add(webContext);
6、在Web.Config中指定身份验证模式为Forms验证:
<authentication mode="Forms">
7、测试:
private void button1_Click(object sender, RoutedEventArgs e)
{
LoginOperation operation = WebContext.Current.Authentication.Login(GetLoginParameters(), LoginCompeted, null);
}
private LoginParameters GetLoginParameters()
{
return new LoginParameters("zhangsan", "123456");
}
private void LoginCompeted(LoginOperation operation)
{
if (operation.LoginSuccess)
{
MessageBox.Show("success");
MessageBox.Show(WebContext.Current.User.DisplayName);
}
else if (operation.HasError)
{
MessageBox.Show(operation.Error.Message);
operation.MarkErrorAsHandled();
}
else if (!operation.IsCanceled)
{
MessageBox.Show("用户名或密码错误!");
}
}
参考资料:http://msdn.microsoft.com/zh-cn/library/ee707361%28v=vs.91%29.aspx