none
Авторизация Silverlight RRS feed

  • Вопрос

  • Здравствуйте,

     

    у меня возник вопрос, как должна организована авторизация в silverlight приложении.

    Пока что у меня это реализована с помощью передачи из asp.net страницы с помощью параметров silverlight объекта, таким образом:

     

     

     <param name="Initparams"
       value="UserRoles=<%=string.Join(";", Roles.GetRolesForUser(HttpContext.Current.User.Identity.Name))%>,
    UserAccount=<%=HttpContext.Current.User.Identity.Name %>"
    />


     

    Хотелось бы знать на сколько с точки зрения безопасности правильный такой подход?

    И если правильный, что делать дальше, в том смысле что в asp.net были объекты В которые можно было записать или прочитать данные авторизации (User, Membership и тп),

    их придется самому писать?



    19 августа 2011 г. 9:05

Ответы

  • > Честно говоря не очень понял что вы здесь имели ввиду, sql server у меня запущен, при создании проекта данные передавались нормально.

    я написал про то, что экземпляр .\SQLEXPRESS должен быть запущен. бывает, что забывают.
    у меня, например, он выключен. вместо него работает "Denali" CTP

    трафик между клиентом и сервером можете посмотреть с помощью Fiddler
    он покажет, что данные передаются как обычный текст. его лучше шифровать перед передачей.

     

    • Помечено в качестве ответа Denis99 29 августа 2011 г. 11:43
    23 августа 2011 г. 14:27
  • > Попробывал то что в статье написано ничего не изменилось

    а пробовали создать новый проект типа BusinessApplication. запустили SQL Server (.\SQLEXPRESS). запустили проект, но данные не передаются. так? кстати, данные передаются незащифрованные, что не очень хорошо.

    > Объект webcontext вроде доступен на других страницах, но все может может лучше его как то в чем то хранить и восстанавливать в конструкторе этих страниц?

    что возвращает WebContext.Current?

    > срабатывают конструкторы других страниц (в моем случае HomePage), как этого ихбежать 

    попробуйте this.InitializeRootVisual(); перенести в Application_UserLoaded

    • Помечено в качестве ответа Denis99 23 августа 2011 г. 14:46
    23 августа 2011 г. 11:52

Все ответы

  • silverlight приложение выводит поля: имя и пароль.
    значение отсылаются на сервер. 
    сервер проверяет полученные данные и возвращает роль или какой-то дескриптор.
    на основе ответа сервера в silverlight выводится соответствующий ui.

    19 августа 2011 г. 10:11
  • у меня windows аутентификация,как что отправлять на сервер не вариант я так понимаю...

     

     

    >>И если правильный, что делать дальше, в том смысле что в asp.net были объекты В которые можно было записать или прочитать данные авторизации (User, Membership и тп),

    их придется самому писать?


    19 августа 2011 г. 10:47
  • > у меня windows аутентификация,как что отправлять на сервер не вариант я так понимаю

    аутентификацию можно сделать как в обычном asp.net mvc приложении.
    но если надо на silverlight, то попробуйте WindowsAuthentication - класс
    пример: How to: Enable Authentication in RIA Services

    > их придется самому писать?

    скорее всего, что нет. т.к. Authentication in WCF RIA Services builds upon the authentication framework in ASP.NET.

    19 августа 2011 г. 11:53
  • новый вопрос, решил реализовать авторизацию с помощью Domain Service Classes (для примера использовал видео урок http://www.techdays.ru/videos/1287.html , авторизация идет с 46 минуты 45 секунды), регистрация сервиса происходит на клиенте в App.xaml в секции Application.Services, у меня такой секции нет, возможно потому что там используется silverlight 3, а у меня silverlight 4, нашел регистрацию в коде

     Application.Current.Services.Add("UserService", new WebUserService())
    


    но у меня этого тоже нет.

    В итоге мне нужно получить WebContext, где я не правильно делаю?

    19 августа 2011 г. 14:15
  • > решил реализовать авторизацию с помощью Domain Service Classes (для примера использовал видео урок ...
    > у меня такой секции нет

    урок устарел. почему остановились на Domain Service Classes? пример из How to: Enable Authentication in RIA Services не подходит?

    19 августа 2011 г. 14:47
  • Спасибо за пояснение.

    что получилось:

    1. Класс генериться нормально, только не заполняется данными на клиенте.

    Используется windows аутентификация.

    web.config сервера:

     

    <configuration>
     <system.webServer>
     <modules runAllManagedModulesForAllRequests="true">
     <add name="DomainServiceModule" preCondition="managedHandler"
     type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
     </modules>
     <validation validateIntegratedModeConfiguration="false" />
     </system.webServer>
     <system.web>
     <httpModules>
     <add name="DomainServiceModule" type="System.ServiceModel.DomainServices.Hosting.DomainServiceHttpModule, System.ServiceModel.DomainServices.Hosting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
     </httpModules>
     <compilation debug="true" targetFramework="4.0" />
     <authentication mode="Windows"></authentication>
     </system.web>
    
     <system.serviceModel>
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true"
     multipleSiteBindingsEnabled="true" />
     </system.serviceModel>
    </configuration>
    

     


    2. Файл на сервере созданный после добавлнея AuthenficationDomainService:

     

    namespace SilverlightApplication2.Web
    {
     [EnableClientAccess]
     public class AuthenticationDomainService1 : AuthenticationBase<User>
     {
     // To enable Forms/Windows Authentication for the Web Application, edit the appropriate section of web.config file.
     }
    
     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; }
     }
    
    }
    

     

    (как  видно из стандартных коментариев  для использования встроенных механизмов авторизации нужно указать тип авторизации вручную в web.config, что я и сделал).

     

    3. На стороне клиента происходит генерация следующего кода:

    namespace SilverlightApplication2
    {
     using System;
     using System.Collections.Generic;
     using System.ComponentModel;
     using System.ComponentModel.DataAnnotations;
     using System.Linq;
     using System.ServiceModel.DomainServices;
     using System.ServiceModel.DomainServices.Client;
     using System.ServiceModel.DomainServices.Client.ApplicationServices;
     using SilverlightApplication2.Web;
     
     
     /// <summary>
     /// Context for the RIA application.
     /// </summary>
     /// <remarks>
     /// This context extends the base to make application services and types available
     /// for consumption from code and xaml.
     /// </remarks>
     public sealed partial class WebContext : WebContextBase
     {
     
     #region Extensibility Method Definitions
    
     /// <summary>
     /// This method is invoked from the constructor once initialization is complete and
     /// can be used for further object setup.
     /// </summary>
     partial void OnCreated();
    
     #endregion
     
     
     /// <summary>
     /// Initializes a new instance of the WebContext class.
     /// </summary>
     public WebContext()
     {
     this.OnCreated();
     }
     
     /// <summary>
     /// Gets the context that is registered as a lifetime object with the current application.
     /// </summary>
     /// <exception cref="InvalidOperationException"> is thrown if there is no current application,
     /// no contexts have been added, or more than one context has been added.
     /// </exception>
     /// <seealso cref="System.Windows.Application.ApplicationLifetimeObjects"/>
     public new static WebContext Current
     {
     get
     {
     return ((WebContext)(WebContextBase.Current));
     }
     }
     
     /// <summary>
     /// Gets a user representing the authenticated identity.
     /// </summary>
     public new User User
     {
     get
     {
     return ((User)(base.User));
     }
     }
     }
    }
    namespace SilverlightApplication2.Web
    {
     using System;
     using System.Collections.Generic;
     using System.ComponentModel;
     using System.ComponentModel.DataAnnotations;
     using System.Linq;
     using System.Runtime.Serialization;
     using System.ServiceModel;
     using System.ServiceModel.DomainServices;
     using System.ServiceModel.DomainServices.Client;
     using System.ServiceModel.DomainServices.Client.ApplicationServices;
     using System.ServiceModel.Web;
     
     
     /// <summary>
     /// The DomainContext corresponding to the 'AuthenticationDomainService1' DomainService.
     /// </summary>
     public sealed partial class AuthenticationDomainService1 : global::System.ServiceModel.DomainServices.Client.ApplicationServices.AuthenticationDomainContextBase
     {
     
     #region Extensibility Method Definitions
    
     /// <summary>
     /// This method is invoked from the constructor once initialization is complete and
     /// can be used for further object setup.
     /// </summary>
     partial void OnCreated();
    
     #endregion
     
     
     /// <summary>
     /// Initializes a new instance of the <see cref="AuthenticationDomainService1"/> class.
     /// </summary>
     public AuthenticationDomainService1() : 
     this(new WebDomainClient<IAuthenticationDomainService1Contract>(new Uri("SilverlightApplication2-Web-AuthenticationDomainService1.svc", UriKind.Relative)))
     {
     }
     
     /// <summary>
     /// Initializes a new instance of the <see cref="AuthenticationDomainService1"/> class with the specified service URI.
     /// </summary>
     /// <param name="serviceUri">The AuthenticationDomainService1 service URI.</param>
     public AuthenticationDomainService1(Uri serviceUri) : 
     this(new WebDomainClient<IAuthenticationDomainService1Contract>(serviceUri))
     {
     }
     
     /// <summary>
     /// Initializes a new instance of the <see cref="AuthenticationDomainService1"/> class with the specified <paramref name="domainClient"/>.
     /// </summary>
     /// <param name="domainClient">The DomainClient instance to use for this DomainContext.</param>
     public AuthenticationDomainService1(DomainClient domainClient) : 
     base(domainClient)
     {
     this.OnCreated();
     }
     
     /// <summary>
     /// Gets the set of <see cref="User"/> entity instances that have been loaded into this <see cref="AuthenticationDomainService1"/> instance.
     /// </summary>
     public EntitySet<User> Users
     {
     get
     {
     return base.EntityContainer.GetEntitySet<User>();
     }
     }
     
     /// <summary>
     /// Gets an EntityQuery instance that can be used to load <see cref="User"/> entity instances using the 'GetUser' query.
     /// </summary>
     /// <returns>An EntityQuery that can be loaded to retrieve <see cref="User"/> entity instances.</returns>
     public EntityQuery<User> GetUserQuery()
     {
     this.ValidateMethod("GetUserQuery", null);
     return base.CreateQuery<User>("GetUser", null, false, false);
     }
     
     /// <summary>
     /// Gets an EntityQuery instance that can be used to load <see cref="User"/> entity instances using the 'Login' query.
     /// </summary>
     /// <param name="userName">The value for the 'userName' parameter of the query.</param>
     /// <param name="password">The value for the 'password' parameter of the query.</param>
     /// <param name="isPersistent">The value for the 'isPersistent' parameter of the query.</param>
     /// <param name="customData">The value for the 'customData' parameter of the query.</param>
     /// <returns>An EntityQuery that can be loaded to retrieve <see cref="User"/> entity instances.</returns>
     public EntityQuery<User> LoginQuery(string userName, string password, bool isPersistent, string customData)
     {
     Dictionary<string, object> parameters = new Dictionary<string, object>();
     parameters.Add("userName", userName);
     parameters.Add("password", password);
     parameters.Add("isPersistent", isPersistent);
     parameters.Add("customData", customData);
     this.ValidateMethod("LoginQuery", parameters);
     return base.CreateQuery<User>("Login", parameters, true, false);
     }
     
     /// <summary>
     /// Gets an EntityQuery instance that can be used to load <see cref="User"/> entity instances using the 'Logout' query.
     /// </summary>
     /// <returns>An EntityQuery that can be loaded to retrieve <see cref="User"/> entity instances.</returns>
     public EntityQuery<User> LogoutQuery()
     {
     this.ValidateMethod("LogoutQuery", null);
     return base.CreateQuery<User>("Logout", null, true, false);
     }
     
     /// <summary>
     /// Creates a new EntityContainer for this DomainContext's EntitySets.
     /// </summary>
     /// <returns>A new container instance.</returns>
     protected override EntityContainer CreateEntityContainer()
     {
     return new AuthenticationDomainService1EntityContainer();
     }
     
     /// <summary>
     /// Service contract for the 'AuthenticationDomainService1' DomainService.
     /// </summary>
     [ServiceContract()]
     public interface IAuthenticationDomainService1Contract
     {
     
     /// <summary>
     /// Asynchronously invokes the 'GetUser' operation.
     /// </summary>
     /// <param name="callback">Callback to invoke on completion.</param>
     /// <param name="asyncState">Optional state object.</param>
     /// <returns>An IAsyncResult that can be used to monitor the request.</returns>
     [FaultContract(typeof(DomainServiceFault), Action="http://tempuri.org/AuthenticationDomainService1/GetUserDomainServiceFault", Name="DomainServiceFault", Namespace="DomainServices")]
     [OperationContract(AsyncPattern=true, Action="http://tempuri.org/AuthenticationDomainService1/GetUser", ReplyAction="http://tempuri.org/AuthenticationDomainService1/GetUserResponse")]
     [WebGet()]
     IAsyncResult BeginGetUser(AsyncCallback callback, object asyncState);
     
     /// <summary>
     /// Completes the asynchronous operation begun by 'BeginGetUser'.
     /// </summary>
     /// <param name="result">The IAsyncResult returned from 'BeginGetUser'.</param>
     /// <returns>The 'QueryResult' returned from the 'GetUser' operation.</returns>
     QueryResult<User> EndGetUser(IAsyncResult result);
     
     /// <summary>
     /// Asynchronously invokes the 'Login' operation.
     /// </summary>
     /// <param name="userName">The value for the 'userName' parameter of this action.</param>
     /// <param name="password">The value for the 'password' parameter of this action.</param>
     /// <param name="isPersistent">The value for the 'isPersistent' parameter of this action.</param>
     /// <param name="customData">The value for the 'customData' parameter of this action.</param>
     /// <param name="callback">Callback to invoke on completion.</param>
     /// <param name="asyncState">Optional state object.</param>
     /// <returns>An IAsyncResult that can be used to monitor the request.</returns>
     [FaultContract(typeof(DomainServiceFault), Action="http://tempuri.org/AuthenticationDomainService1/LoginDomainServiceFault", Name="DomainServiceFault", Namespace="DomainServices")]
     [OperationContract(AsyncPattern=true, Action="http://tempuri.org/AuthenticationDomainService1/Login", ReplyAction="http://tempuri.org/AuthenticationDomainService1/LoginResponse")]
     IAsyncResult BeginLogin(string userName, string password, bool isPersistent, string customData, AsyncCallback callback, object asyncState);
     
     /// <summary>
     /// Completes the asynchronous operation begun by 'BeginLogin'.
     /// </summary>
     /// <param name="result">The IAsyncResult returned from 'BeginLogin'.</param>
     /// <returns>The 'QueryResult' returned from the 'Login' operation.</returns>
     QueryResult<User> EndLogin(IAsyncResult result);
     
     /// <summary>
     /// Asynchronously invokes the 'Logout' operation.
     /// </summary>
     /// <param name="callback">Callback to invoke on completion.</param>
     /// <param name="asyncState">Optional state object.</param>
     /// <returns>An IAsyncResult that can be used to monitor the request.</returns>
     [FaultContract(typeof(DomainServiceFault), Action="http://tempuri.org/AuthenticationDomainService1/LogoutDomainServiceFault", Name="DomainServiceFault", Namespace="DomainServices")]
     [OperationContract(AsyncPattern=true, Action="http://tempuri.org/AuthenticationDomainService1/Logout", ReplyAction="http://tempuri.org/AuthenticationDomainService1/LogoutResponse")]
     IAsyncResult BeginLogout(AsyncCallback callback, object asyncState);
     
     /// <summary>
     /// Completes the asynchronous operation begun by 'BeginLogout'.
     /// </summary>
     /// <param name="result">The IAsyncResult returned from 'BeginLogout'.</param>
     /// <returns>The 'QueryResult' returned from the 'Logout' operation.</returns>
     QueryResult<User> EndLogout(IAsyncResult result);
     
     /// <summary>
     /// Asynchronously invokes the 'SubmitChanges' operation.
     /// </summary>
     /// <param name="changeSet">The change-set to submit.</param>
     /// <param name="callback">Callback to invoke on completion.</param>
     /// <param name="asyncState">Optional state object.</param>
     /// <returns>An IAsyncResult that can be used to monitor the request.</returns>
     [FaultContract(typeof(DomainServiceFault), Action="http://tempuri.org/AuthenticationDomainService1/SubmitChangesDomainServiceFault", Name="DomainServiceFault", Namespace="DomainServices")]
     [OperationContract(AsyncPattern=true, Action="http://tempuri.org/AuthenticationDomainService1/SubmitChanges", ReplyAction="http://tempuri.org/AuthenticationDomainService1/SubmitChangesResponse")]
     IAsyncResult BeginSubmitChanges(IEnumerable<ChangeSetEntry> changeSet, AsyncCallback callback, object asyncState);
     
     /// <summary>
     /// Completes the asynchronous operation begun by 'BeginSubmitChanges'.
     /// </summary>
     /// <param name="result">The IAsyncResult returned from 'BeginSubmitChanges'.</param>
     /// <returns>The collection of change-set entry elements returned from 'SubmitChanges'.</returns>
     IEnumerable<ChangeSetEntry> EndSubmitChanges(IAsyncResult result);
     }
     
     internal sealed class AuthenticationDomainService1EntityContainer : EntityContainer
     {
     
     public AuthenticationDomainService1EntityContainer()
     {
     this.CreateEntitySet<User>(EntitySetOperations.Edit);
     }
     }
     }
     
     /// <summary>
     /// The 'User' entity class.
     /// </summary>
     [DataContract(Namespace="http://schemas.datacontract.org/2004/07/SilverlightApplication2.Web")]
     public sealed partial class User : Entity, global::System.Security.Principal.IIdentity, global::System.Security.Principal.IPrincipal
     {
     
     private string _name = string.Empty;
     
     private IEnumerable<string> _roles;
     
     #region Extensibility Method Definitions
    
     /// <summary>
     /// This method is invoked from the constructor once initialization is complete and
     /// can be used for further object setup.
     /// </summary>
     partial void OnCreated();
     partial void OnNameChanging(string value);
     partial void OnNameChanged();
     partial void OnRolesChanging(IEnumerable<string> value);
     partial void OnRolesChanged();
    
     #endregion
     
     
     /// <summary>
     /// Initializes a new instance of the <see cref="User"/> class.
     /// </summary>
     public User()
     {
     this.OnCreated();
     }
     
     /// <summary>
     /// Gets or sets the 'Name' value.
     /// </summary>
     [DataMember()]
     [Editable(false, AllowInitialValue=true)]
     [Key()]
     [RoundtripOriginal()]
     public string Name
     {
     get
     {
     return this._name;
     }
     set
     {
     if ((this._name != value))
     {
      this.OnNameChanging(value);
      this.ValidateProperty("Name", value);
      this._name = value;
      this.RaisePropertyChanged("Name");
      this.OnNameChanged();
      this.RaisePropertyChanged("IsAuthenticated");
     }
     }
     }
     
     /// <summary>
     /// Gets or sets the 'Roles' value.
     /// </summary>
     [DataMember()]
     [Editable(false)]
     public IEnumerable<string> Roles
     {
     get
     {
     return this._roles;
     }
     set
     {
     if ((this._roles != value))
     {
      this.OnRolesChanging(value);
      this.ValidateProperty("Roles", value);
      this._roles = value;
      this.RaisePropertyChanged("Roles");
      this.OnRolesChanged();
     }
     }
     }
     
     string global::System.Security.Principal.IIdentity.AuthenticationType
     {
     get
     {
     return string.Empty;
     }
     }
     
     /// <summary>
     /// Gets a value indicating whether the identity is authenticated.
     /// </summary>
     /// <remarks>
     /// This value is <c>true</c> if <see cref="Name"/> is not <c>null</c> or empty.
     /// </remarks>
     public bool IsAuthenticated
     {
     get
     {
     return (true != string.IsNullOrEmpty(this.Name));
     }
     }
     
     string global::System.Security.Principal.IIdentity.Name
     {
     get
     {
     return this.Name;
     }
     }
     
     global::System.Security.Principal.IIdentity global::System.Security.Principal.IPrincipal.Identity
     {
     get
     {
     return this;
     }
     }
     
     /// <summary>
     /// Computes a value from the key fields that uniquely identifies this entity instance.
     /// </summary>
     /// <returns>An object instance that uniquely identifies this entity instance.</returns>
     public override object GetIdentity()
     {
     return this._name;
     }
     
     /// <summary>
     /// Return whether the principal is in the role.
     /// </summary>
     /// <remarks>
     /// Returns whether the specified role is contained in the roles.
     /// This implementation is case sensitive.
     /// </remarks>
     /// <param name="role">The name of the role for which to check membership.</param>
     /// <returns>Whether the principal is in the role.</returns>
     public bool IsInRole(string role)
     {
     if ((this.Roles == null))
     {
     return false;
     }
     return global::System.Linq.Enumerable.Contains(this.Roles, role);
     }
     }
    }
    
    

     

    4. Заполняю класс клиента таким образом:

     

     public App()
     {
     this.Startup += this.Application_Startup;
     this.Exit += this.Application_Exit;
     this.UnhandledException += this.Application_UnhandledException;
    
     InitializeComponent();
    
    
     WebContext w = new WebContext() { Authentication = new System.ServiceModel.DomainServices.Client.ApplicationServices.WindowsAuthentication() };
     this.ApplicationLifetimeObjects.Add(w);
     }
    

    класс WindowsAuthentication, возвращает обхект с пустыми значениями, и как следствие с отсутствующими авторизацинными данными.

     

    Как мне передать в него реальные данные?

     




    • Изменено Denis99 21 августа 2011 г. 23:59
    21 августа 2011 г. 23:33
  • Проект который я создавал, Silverlight application с использванием RIA services

     

    заранее извиняюсь если много букв)

    21 августа 2011 г. 23:38
  • > класс WindowsAuthentication, возвращает обхект с пустыми значениями

    Enable Integrated Windows Authentication в брузере включен?
    см. How to: Use Windows Authentication to Secure a Service for Silverlight Applications

    22 августа 2011 г. 6:50
  • Да включен,

     

    Попробывал то что в статье написано ничего не изменилось. Вставил в web.config сервера:

     

     <system.serviceModel>
     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
     <bindings>
      <basicHttpBinding>
      <binding name="myBinding">
       <security mode="None">
       <transport clientCredentialType="Ntlm"></transport>
       </security>
      </binding>
      </basicHttpBinding>
     </bindings>
     <client>
      <endpoint address="http://localhost:52878/BusinessApplication1-Web-AuthenticationService.svc"
        binding="basicHttpBinding"
        bindingConfiguration="myBinding"
        contract="BusinessApplication1.Web.AuthenticationService"></endpoint>
     </client>
     </system.serviceModel>
    

     


    Решил переделать Bussiness Application проект. Там авторизация уже готовая.

     

     public partial class App : Application
     {
      
      public App()
      {
       InitializeComponent();<br/><br/>   WebContext webContext = new WebContext();<br/>   
    webContext.Authentication = new WindowsAuthentication();<br/>
    this.ApplicationLifetimeObjects.Add(webContext);<br/><br/>
    WebContext.Current.Authentication.LoggedIn += this.Authentication_LoggedIn;<br/> }<br/><br/>
     private void Authentication_LoggedIn(object sender, AuthenticationEventArgs e)<br/> {<br/>
    //TODO<br/> }<br/><br/> private void Application_Startup(object sender, StartupEventArgs e) { this.Resources.Add("WebContext", WebContext.Current); WebContext.Current.Authentication.LoadUser(this.Application_UserLoaded, null); this.InitializeRootVisual(); } private void Application_UserLoaded(LoadUserOperation operation) { } protected virtual void InitializeRootVisual() { BusinessApplication1.Controls.BusyIndicator busyIndicator = new BusinessApplication1.Controls.BusyIndicator(); busyIndicator.Content = new MainPage(); busyIndicator.HorizontalContentAlignment = HorizontalAlignment.Stretch; busyIndicator.VerticalContentAlignment = VerticalAlignment.Stretch; this.RootVisual = busyIndicator; } }

    Как я понимаю, здесь при старте silverlight приложения создается объект WebContext, который генириться на основании класса на стороне сервера, заполнения объекта происходит в методе :
    WebContext.Current.Authentication.LoadUser(this.Application_UserLoaded, null);
    

    после чего происходит ожидание выполнения функции (ответа от сервера), при срабатывании этих событий объект WebContext уже заполнен. Если я правильно понял, есть несколько непонятных для меня моментов:

    1. Объект webcontext вроде доступен на других страницах, но все может может лучше его  как то в чем то хранить и восстанавливать в конструкторе этих страниц?

    2. До того как сработало событие от сервера(Application_UserLoaded), если пройти в пошагово режиме видно, что срабатывают конструкторы других страниц (в моем случае HomePage), как этого ихбежать, я так понимаю пока не пришел ответ авторизации, приложение должно его ожидать, или я не прав?



    23 августа 2011 г. 7:35
  • > Попробывал то что в статье написано ничего не изменилось

    а пробовали создать новый проект типа BusinessApplication. запустили SQL Server (.\SQLEXPRESS). запустили проект, но данные не передаются. так? кстати, данные передаются незащифрованные, что не очень хорошо.

    > Объект webcontext вроде доступен на других страницах, но все может может лучше его как то в чем то хранить и восстанавливать в конструкторе этих страниц?

    что возвращает WebContext.Current?

    > срабатывают конструкторы других страниц (в моем случае HomePage), как этого ихбежать 

    попробуйте this.InitializeRootVisual(); перенести в Application_UserLoaded

    • Помечено в качестве ответа Denis99 23 августа 2011 г. 14:46
    23 августа 2011 г. 11:52
  • >> Попробывал то что в статье написано ничего не изменилось

    >а пробовали создать новый проект типа BusinessApplication. запустили SQL Server (.\SQLEXPRESS). запустили проект, но данные не передаются. так? кстати, данные передаются >незащифрованные, что не очень хорошо.

    Честно говоря не очень понял что вы здесь имели ввиду, sql server у меня запущен, при создании проекта данные передавались нормально. Единственное что настораживает, это то свойства объекта Authentication, IsLoggingIn, IsLoadingUser возвращаюь false

     

    >> Объект webcontext вроде доступен на других страницах, но все может может лучше его как то в чем то хранить и восстанавливать в конструкторе этих страниц?

    >что возвращает WebContext.Current?

    Заполненный тип WebContext

     

    >> срабатывают конструкторы других страниц (в моем случае HomePage), как этого ихбежать 

    >попробуйте this.InitializeRootVisual(); перенести в Application_UserLoaded

    Да, не подумал, спс

    23 августа 2011 г. 12:41
  • > Честно говоря не очень понял что вы здесь имели ввиду, sql server у меня запущен, при создании проекта данные передавались нормально.

    я написал про то, что экземпляр .\SQLEXPRESS должен быть запущен. бывает, что забывают.
    у меня, например, он выключен. вместо него работает "Denali" CTP

    трафик между клиентом и сервером можете посмотреть с помощью Fiddler
    он покажет, что данные передаются как обычный текст. его лучше шифровать перед передачей.

     

    • Помечено в качестве ответа Denis99 29 августа 2011 г. 11:43
    23 августа 2011 г. 14:27