Переподключение к сеансу 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.

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