Переподключение к сеансу Servicestack в приложении asp.net MVC4
У меня есть веб-приложение asp.net mvc4, которое использует данные из API, написанного на C# и размещенного на машине Linux с Apache / mod_mono
Клиентское приложение написано на C#/asp.net - оно работает на другом веб-сервере, также Linux / Apache / mod_mono. Я не уверен, важны ли эти детали в этом случае, но я подумал, что любой фон может помочь.
Вопрос, который привел к этому: экземпляр AppHostBase не установлен - Помог мне немного лучше понять, как все это сочетается.
Я считаю, что правильный вопрос, который я должен задать сейчас: как создать сеанс в пакете служб (на сервере API), как правильно подключиться к нему?
Следуя ответам на предыдущие вопросы, я использовал этот фрагмент кода в своем контроллере аутентификации в клиентском приложении:
var authService = AppHostBase.Resolve<AuthService>();
authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();
var AuthResponse = authService.Authenticate(new Auth
{
provider = "credentials",
UserName = user.user_id,
Password = user.password,
RememberMe = true
});
Это возвращает ResolutionException:
Обязательная зависимость типа ServiceStack.ServiceInterface.Auth.AuthService не может быть разрешена.
Есть ли что-то простое, что я мог бы упустить, когда дело доходит до того, чтобы заставить клиента работать из приложения asp.net?
Я прошу прощения, если вопрос слишком расплывчатый и с радостью предоставит дополнительную информацию.
Обновить:
Это AuthController - извините за беспорядок, я пробовал несколько вещей с момента моего последнего поста:
{
public partial class AuthController : BaseController
{
JsonServiceClient client = new ServiceStack.ServiceClient.Web.JsonServiceClient("<TheAPIurl>");
// GET: /Login/
public ActionResult login()
{
if (Session["IsAuthenticated"] != null)
{
ViewData["Result"] = Session["IsAuthenticated"];
}
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult login(UserModel user)
{
try
{
var authService = AppHostBase.Resolve<AuthService>();
authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();
var AuthResponse = authService.Authenticate(new Auth
{
provider = "credentials",
UserName = user.user_id,
Password = user.password,
RememberMe = true
});
if (AuthResponse.SessionId != null)
{
Session["IsAuthenticated"] = true;
Session["UserID"] = AuthResponse.UserName;
Session["jsclient"] = client;
FormsAuthentication.SetAuthCookie(user.user_id, true);
return Redirect("/default");
}
else
{
Session["IsAuthenticated"] = false;
}
}
catch (Exception ex)
{
Session["IsAuthenticated"] = false;
}
return View();
}
protected override void ExecuteCore()
{
throw new NotImplementedException();
}
}
}
1 ответ
Аутентификация с локальным экземпляром ServiceStack
Вы можете извлечь автоматически подключенную службу ServiceStack (или другую зависимость IOC) из контейнера ServiceStack, если экземпляр ServiceStack размещен в том же домене приложения, что и MVC, то есть:
var authService = AppHostBase.Resolve<AuthService>();
authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();
Хотя рекомендуемый код для разрешения автоматической реализации другого сервиса:
using (var authAservice = AppHostBase.ResolveService<AuthService>()) {
...
}
т.е. как сервисы могут использовать ресурсы, которые должны быть утилизированы. Внутри службы ServiceStack вы должны использовать base.ResolveService<AuthService>()
вместо.
Поэтому, если ServiceStack размещен в том же App Domain, что и MVC, вы можете вызвать каталог Service, например:
var authResponse = authService.Authenticate(new Auth {
provider = "credentials",
UserName = user.user_id,
Password = user.password,
RememberMe = true
});
Аутентификация с помощью экземпляра Remote ServiceStack
В противном случае, если он удаленный, вам нужно использовать одного из сервисных клиентов ServiceStack C#, например:
var client = new JsonServiceClient(ServiceStackBaseUrl);
var authResponse = client.Post(new Auth {
provider = "credentials",
UserName = user.user_id,
Password = user.password,
RememberMe = true
});
Присоединение ServiceStack SessionId обратно к исходному запросу MVC
Это установит аутентифицированный сеанс с этим клиентом ServiceClient, подключив его к ss-pid
Cookie (см. Документацию по сессиям для получения дополнительной информации). Вы можете передать этот cookie в исходный браузер, который вызвал MVC с:
var response = HttpContext.Current.Response.ToResponse();
response.Cookies.AddSessionCookie(
SessionFeature.PermanentSessionId, authResponse.SessionId);
Последующие запросы с аутентифицированным сеансом
Чтобы повторно подключиться к удаленному аутентифицированному сеансу ServiceStack из MVC, вам потребуется передать cookie обратно в клиент службы, например:
var cookie = HttpContext.Request.Cookies.Get(SessionFeature.PermanentSessionId);
var client = new JsonServiceClient(ServiceStackBaseUrl);
var cookie = new Cookie(SessionFeature.PermanentSessionId, cookie.Value);
client.CookieContainer.Add(cookie);
Вы можете установить домен cookie, глобально в Web.Config:
<httpCookies domain="mydomain.com" />
Или во время выполнения с:
cookie.Domain = "mydomain.com";
В тестах интеграции ServiceStack AuthTests.cs есть несколько других полезных примеров, показывающих, как работает аутентификация в ServiceStack.