.net ria service在实际应用中提供了方便快速的数据访问层,那么身份验证也是一个比较头痛的事情,这个问题曾经也一度困扰着我。
最到最近.net ria service home的出现才找到最合适自己使用的方法,不过还是有一些bug,可能是.net ria service还是ctp版的原因。
这里简单讲述一下bug:
客户端可以取得roles的列表,可惜在domain service class里的定义不生效。希望这个问题在.net ria service的下个版本会解决。
在常规使用中我更喜欢使用自定义的表去管理程序的用户,这样灵活度比较高,而且心中也有数,所以一直不想用membership做用户的管理。所以一直寻找.net ria service中的自定义身份验证。祥细操作如下:
1)新建一个domain service class作为验证身份之用。
1: namespace jacSL3RTMAuthentication.Web
2: {3: using System;
4: using System.Collections.Generic;
5: using System.ComponentModel;
6: using System.ComponentModel.DataAnnotations;
7: using System.Linq;
8: using System.Web.Ria;
9: using System.Web.Ria.Data;
10: using System.Web.DomainServices;
11: using System.Data;
12: using System.Web.DomainServices.LinqToEntities;
13: using System.Web.Ria.ApplicationServices;
14: using System.Web;
15: using System.Web.Security;
16: 17: 18: // Implements application logic using the authenEntities context.
19: // TODO: Add your application logic to these methods or in additional methods.
20: [EnableClientAccess()]
21: public class LoginDomainService : LinqToEntitiesDomainService<authenEntities>,IAuthentication<myUser>
22: {23: #region IAuthentication<myUser> Members
24: 25: public myUser GetUser()
26: {27: if ((HttpContext.Current != null) && (HttpContext.Current.User != null) &&
28: HttpContext.Current.User.Identity.IsAuthenticated)
29: {30: var ut = this.Context.userTable.First(u => u.userId.Equals(HttpContext.Current.User.Identity.Name));
31: return new myUser() { Name = ut.userId };
32: }33: return null;
34: }35: 36: public myUser Login(string userName, string password, bool isPersistent, string customData)
37: {38: if ((from u in Context.userTable where u.userId.Equals(userName) select u).Count() ==1 )
39: {40: var user = Context.userTable.First(u => u.userId.Equals(userName));
41: if (user.pwd.Equals(password))
42: {43: FormsAuthentication.SetAuthCookie(user.userId, isPersistent);
44: return new myUser() { Name=user.userId };
45: }46: }47: return null;
48: }49: 50: public myUser Logout()
51: {52: FormsAuthentication.SignOut();
53: return null;
54: }55: 56: public void UpdateUser(myUser user)
57: {58: throw new NotImplementedException();
59: }60: 61: #endregion
62: }
63: 64: public class myUser : IUser
65: {
66: 67: #region IUser Members
68: [Key]
69: public string Name
70: {71: get;
72: set;
73: }74: 75: public IEnumerable<string> Roles
76: {77: get;
78: set;
79: }80: 81: #endregion
82: }
83: }2)使用时先到silverlight端的app.xaml中把身份验证定义
1: <Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
2: xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
3: xmlns:app="clr-namespace:jacSL3RTMAuthentication"
4: xmlns:appsvc="clr-namespace:System.Windows.Ria.ApplicationServices;assembly=System.Windows.Ria"
5: x:Class="jacSL3RTMAuthentication.App"
6: >
7: <Application.ApplicationLifetimeObjects>
8: <app:RiaContext>
9: <app:RiaContext.Authentication>
10: <appsvc:FormsAuthentication DomainContextType="jacSL3RTMAuthentication.Web.LoginDomainService" />
11: <!--<appsvc:WindowsAuthentication/>-->
12: </app:RiaContext.Authentication>
13: </app:RiaContext>
14: </Application.ApplicationLifetimeObjects>
15: </Application>
16: jacSL3RTMAuthentication.Web.LoginDomainService是我定义的命名及空间,实际开发时请按你自己的命名及空间。
3)使用方法,以下是我的一些测试验证的代码:
1: using System.Windows.Ria.ApplicationServices;
2: 3: namespace jacSL3RTMAuthentication
4: {5: public partial class MainPage : UserControl
6: {
7: private AuthenticationService authSv = RiaContext.Current.Authentication;
8: private AuthenticationOperation authOp;
9: 10: public MainPage()
11: {12: InitializeComponent();13: bt_login.Click += new RoutedEventHandler(bt_login_Click);
14: }15: 16: void bt_login_Click(object sender, RoutedEventArgs e)
17: {18: authOp = authSv.Login(new LoginParameters(tb_userid.Text, tb_pwd.Password, true, null));
19: authOp.Completed += new EventHandler(authOp_Completed);
20: }21: 22: void authOp_Completed(object sender, EventArgs e)
23: {24: LoginOperation lo = (LoginOperation)sender;
25: 26: if (lo.LoginSuccess)
27: {28: MessageBox.Show("welcome " + lo.User.Identity.Name);
29: }30: 31: if (lo.HasError)
32: {33: MessageBox.Show(lo.Error.Message);
34: }35: 36: jacSL3RTMAuthentication.Web.dataDomainContext data = new jacSL3RTMAuthentication.Web.dataDomainContext();
37: dg.ItemsSource = data.pdTables;38: data.Load(data.GetPdTableQuery());39: 40: authSv.Logout();41: }42: }43: }结束语:
希望本文对你有所帮助
Jacob Lai
欢迎您参与更多关于此话题的讨论,本文原创地址为:http://funsl.com