Я использовал шаблон Silverlight BusinessApplication в VS2010. Я изменил AuthenticationService, чтобы использовать мои собственные методы аутентификации - требование состоит в том, чтобы пользователь входил в систему со своим именем входа SQL (без AD в компании).
При входе в систему я создаю SQLConnection, пытаюсь открыть его, затем получаю их данные (понятное имя, роли и т. Д.) Из таблицы User. Затем я сохраняю имя пользователя и пароль, которые они ввели, и каждый раз, когда они обращаются к БД через DomainService, я перезаписываю CreateObjectContext и вставляю имя пользователя и пароль, которые они ввели в БД.
Я изменил AuthenticationService для наследования от IAuthentication и LinqToEntitiesDomainService, в основном для доступа к таблице User.
У меня возникла проблема при запуске приложения до того, как пользователь вошел в систему. Элемент управления LoginStatus, который поставляется с шаблоном BusinessApplication, имеет следующую строку:
private readonly AuthenticationService authService = WebContext.Current.Authentication;
Это вызывает вызов конструктора моего AuthenticationService и, как часть этого, попытка создания ObjectContext, но пользователь еще не вошел в систему, поэтому у меня нет имени пользователя + пароля для добавления в строку подключения. Для разработчиков цели, я просто использую свое имя пользователя и пароль, если не вошел в систему, но теперь мне нужно это исправить.
Есть идеи, как мне это обойти? Насколько я вижу, у меня есть следующие варианты:
- Не используйте EF (я бы предпочел использовать его, так как остальная часть моего доступа к данным осуществляется с помощью EF).
- Создайте фиктивного пользователя в БД и используйте его в качестве учетных данных, если не вошли в систему (не идеально).
Есть ли другой способ обойти это? На конструкции моего AuthenticationService предотвратить вызов CreateObjectContext?
Любая помощь / предложения приветствуются.
Обновление
Я изменил свой AuthenticationService, чтобы он наследовал от DomainService, а не LinqToEntitiesDomainService, и использовал SqlDataReader для получения требуемых пользовательских данных, но мне по-прежнему любопытно, есть ли другой способ.