Получение проверки подлинности с помощью форм на странице входа ASP.NET, используемой приложением Silverlight 4

Это должно просто работать. Я прочитал все статьи, которые я мог найти через google по этой теме, пытался скопировать столько, сколько мог, из других статей как в Stackru, так и в CodeProject и других, но независимо от того, что я пробую, - это не работает.

У меня есть приложение Silverlight, которое отлично работает с использованием проверки подлинности Windows.

Чтобы запустить его при проверке подлинности с помощью форм, я:

Отредактировал файл web.config, чтобы включить проверку подлинности с помощью форм (и удалить конфигурацию проверки подлинности Windows):

    <authentication mode="Forms">
    <forms name=".ASPXAUTH" loginUrl="logon.aspx" defaultUrl="index.aspx"      protection="All" path="/" timeout="30" />
    </authentication>

Создайте стандартный код logon.aspx и logon.aspx.cs за страницей для ввода имени пользователя и пароля и создайте файл cookie для аутентификации после успешного входа, а затем перенаправьте пользователя на корневую страницу веб-сайта, которая это приложение Silverlight:

    private void cmdLogin_ServerClick( object sender, System.EventArgs e )
    {
        if ( ValidateUser( txtUserName.Value, txtUserPass.Value ) )
        {
            FormsAuthentication.SetAuthCookie(txtUserName.Value, true);
            var cookie = FormsAuthentication.GetAuthCookie(txtUserName.Value, true);
            cookie.Domain = "mymachine.mydomain.com";
            this.Response.AppendCookie(cookie);

            string strRedirect;
            strRedirect = Request["ReturnUrl"];
            if ( strRedirect == null )
                strRedirect = "index.aspx";
            Response.Redirect( strRedirect, true );
        }
    }

Таким образом, редирект после успешного входа в систему запускает мое приложение silverlight.

Однако пользователь не аутентифицируется при выполнении кода запуска Silverlight:

    public App()
    {
        InitializeComponent();
        var webContext = new WebContext();
        webContext.Authentication = new FormsAuthentication();
        ApplicationLifetimeObjects.Add( webContext );
    }

    private void ApplicationStartup( object sender, StartupEventArgs e )
    {
        Resources.Add( "WebContext", WebContext.Current );

        // This will automatically authenticate a user when using windows authentication
        // or when the user chose "Keep me signed in" on a previous login attempt
        WebContext.Current.Authentication.LoadUser(ApplicationUserLoaded, null);

        // Show some UI to the user while LoadUser is in progress
        InitializeRootVisual();
    }

Ошибка возникает в методе ApplicationUserLoaded, у которого всегда есть свойство HasError, равное true при входе в метод.

    private void ApplicationUserLoaded( LoadUserOperation operation )
    {
        if((operation != null) && operation.HasError)
        {
            operation.MarkErrorAsHandled();
            HandlerShowWebServiceCallBackError(operation.Error, "Error loading user context.");
            return;
        }
        ...
    }

Сообщение об ошибке выглядит следующим образом: из того, что мне кажется, пользователь не считается аутентифицированным при входе в приложение silverlight, поэтому он направляет код, чтобы попытаться вернуть страницу входа, которая возвращает данные, неожиданные для пользователя. приложение Silverlight:

An exception occurred while attempting to contact the web service.
Please try again, and if the error persists, contact your administrator.

Error details:
Error loading user context.

Exception details:
Load operation failed for query 'GetUser'. The remote server returned an error: NotFound.

Есть идеи?

Исходя из всего, что я прочитал, это должно быть довольно просто и просто работать - так что я, очевидно, делаю очень простую ошибку.

Мне интересно, если после аутентификации пользователя на моей веб-странице logon.aspx мне нужно каким-то образом передать аутентифицированный экземпляр WebContext со страницы входа в мое приложение silverlight вместо создания нового экземпляра в коде запуска приложения silverlight - но понятия не имею, как это сделать.

Цените любые или все предложения.

1 ответ

Другие вопросы по тегам