Получение проверки подлинности с помощью форм на странице входа 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 ответ
Я подозреваю Response.Redirect("...", true);
Согласно этой статье вы должны передать false, чтобы сохранить сеанс.