[ This document was written for WCF Services Version 1 Service Pack 2 and might not be up to date
Please see Release Notes or Changelog for a list of changes since WCF RIA Services ]
This topic demonstrates how to enable user authentication in your application by using Open Ria Services. It shows the code that you must add to both the server project and the client project to make authentication available as a service to the client application. You can restrict access to a domain operation to only authenticated users by applying the RequiresAuthenticationAttribute attribute to the domain operation.
Authentication in Open Ria Services builds upon the authentication framework in ASP.NET. For more information about ASP.NET authentication, see Introduction to Membership.
To configure the server project
In the server project, open the Web.config file.
In the \ element, add an \ element.
Set the mode property to the authentication mode that you will use in the project.
The following code shows the \ element with mode set to Forms. Set the mode property to Windows to use Windows Authentication. Your Web.config file will contain other elements.
In Solution Explorer, right-click the server project, select Add and then New Item.
The Add New Item dialog box appears.
Select the Authentication Domain Service template and specify a name for the service.
Click Add.
To restrict access to a domain operation to only authenticated users, apply the RequiresAuthenticationAttribute attribute to the domain operation.
The following example specifies that only authenticated users can access the GetSalesOrderHeaders method.
<RequiresAuthentication()> _
Public Function GetSalesOrderHeaders() As IQueryable(Of SalesOrderHeader)
Return Me.ObjectContext.SalesOrderHeaders
End Function
To configure the authentication service on the client project
In the client project, open the code-behind file for the App.xaml file (App.xaml.cs or App.xaml.vb).
In the constructor, create an instance of the WebContext class.
Set the Authentication property to the type of authentication that you configured in the server project, and add the WebContext instance to the ApplicationLifetimeObjects.
The following example shows how to set authentication to FormsAuthentication.
Public Sub New()
InitializeComponent()
Dim webcontext As New WebContext
webcontext.Authentication = New OpenRiaServices.Client.Authentication.FormsAuthentication
Me.ApplicationLifetimeObjects.Add(webcontext)
End Sub
If you are using Windows Authentication or you want to load a user who has persisted credentials, call the LoadUser method before giving the user the option to log in.
The following example shows how to call the LoadUser method from the Application_Startup method.
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
WebContext.Current.Authentication.LoadUser(AddressOf OnLoadUser_Completed, Nothing)
Me.RootVisual = New MainPage()
End Sub
Private Sub OnLoadUser_Completed(ByVal operation As LoadUserOperation)
' Update UI, if necessary
End Sub
privatevoidApplication_Startup(object sender,StartupEventArgs e){WebContext.Current.Authentication.LoadUser(OnLoadUser_Completed,null);this.RootVisual=newMainPage();}privatevoidOnLoadUser_Completed(LoadUserOperation operation){ // update UI, if necessary}
If necessary, add a page to the client project for collecting user credentials.
In the code-behind file for the login page, call the Login method to login users.
The following example shows how to call the Login method from an event handler for a login button. A callback method is included to respond to the results of the login operation.
Private Sub LoginButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim lp As LoginParameters = New LoginParameters(UserName.Text, Password.Password)
WebContext.Current.Authentication.Login(lp, AddressOf Me.LoginOperation_Completed, Nothing)
LoginButton.IsEnabled = False
LoginResult.Text = ""
End Sub
Private Sub LoginOperation_Completed(ByVal lo As LoginOperation)
If (lo.HasError) Then
LoginResult.Text = lo.Error.Message
LoginResult.Visibility = System.Windows.Visibility.Visible
lo.MarkErrorAsHandled()
ElseIf (lo.LoginSuccess = False) Then
LoginResult.Text = "Login failed. Please check user name and password."
LoginResult.Visibility = System.Windows.Visibility.Visible
ElseIf (lo.LoginSuccess = True) Then
SetControlVisibility(True)
End If
LoginButton.IsEnabled = True
End Sub
privatevoidLoginButton_Click(object sender,RoutedEventArgs e){LoginParameters lp =newLoginParameters(UserName.Text,Password.Password);WebContext.Current.Authentication.Login(lp,this.LoginOperation_Completed,null);LoginButton.IsEnabled=false;LoginResult.Text="";}privatevoidLoginOperation_Completed(LoginOperation lo){if (lo.HasError) {LoginResult.Text=lo.Error.Message;LoginResult.Visibility=System.Windows.Visibility.Visible;lo.MarkErrorAsHandled(); }elseif (lo.LoginSuccess==false) {LoginResult.Text="Login failed. Please check user name and password.";LoginResult.Visibility=System.Windows.Visibility.Visible; }elseif (lo.LoginSuccess==true) {SetControlVisibility(true); }LoginButton.IsEnabled=true;}
The following example shows how to call the Logout method from an event handler for a logout button. A callback method is included to respond to the results of the logout operation.
Private Sub LogoutButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
WebContext.Current.Authentication.Logout(AddressOf Me.LogoutOperation_Completed, Nothing)
End Sub
Private Sub LogoutOperation_Completed(ByVal lo As LogoutOperation)
If (Not (lo.HasError)) Then
SetControlVisibility(False)
Else
Dim ew As ErrorWindow = New ErrorWindow("Logout failed.", "Please try logging out again.")
ew.Show()
lo.MarkErrorAsHandled()
End If
End Sub
privatevoidLogoutButton_Click(object sender,RoutedEventArgs e){WebContext.Current.Authentication.Logout(this.LogoutOperation_Completed,null);}privatevoidLogoutOperation_Completed(LogoutOperation lo){if (!lo.HasError) {SetControlVisibility(false); }else {ErrorWindow ew =newErrorWindow("Logout failed.","Please try logging out again.");ew.Show();lo.MarkErrorAsHandled(); }}
To check whether a user is authenticated, retrieve the IsAuthenticated property on the generated User entity.
The following example checks if the current user is authenticated before retrieving a profile property and calling a domain operation.
Private Sub LoadReports()
If (WebContext.Current.User.IsAuthenticated) Then
numberOfRows = WebContext.Current.User.DefaultRows
AddHandler WebContext.Current.User.PropertyChanged, AddressOf User_PropertyChanged
LoadRestrictedReports()
Else
CustomersGrid.Visibility = System.Windows.Visibility.Collapsed
SalesOrdersGrid.Visibility = System.Windows.Visibility.Collapsed
End If
Dim loadProducts = context.Load(context.GetProductsQuery().Take(numberOfRows))
ProductsGrid.ItemsSource = loadProducts.Entities
End Sub
If you want to make the WebContext object available in XAML, add the current WebContext instance to the application resources in the Application.Startup event before creating the root visual.
The following example shows how to add the WebContext instance as an application resource.
Private Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup
Me.Resources.Add("WebContext", WebContext.Current)
Me.RootVisual = New MainPage()
End Sub