2

C# で記述され、Apache / mod_mono を使用して Linux マシンでホストされている API からデータ データを消費する asp.net mvc4 Web アプリケーションがあります。

クライアント アプリケーションは C#/asp.net で記述されています - 別の Web サーバー上で実行され、Linux / Apache / mod_mono でも実行されます。この場合、これらの詳細が重要かどうかはわかりませんが、背景が役立つ可能性があると考えました.

これに至るまでの質問: AppHostBase インスタンスが設定されていません - これがどのように組み合わされるかについて、かなり理解を深めるのに役立ちました。

私が今尋ねるべき適切な質問は次のとおりだと思います: servicestack (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();
    }
}

}

4

1 に答える 1

7

ローカル ServiceStack インスタンスによる認証

ServiceStack インスタンスが MVC と同じアプリ ドメイン内でホストされている場合、ServiceStack コンテナーから自動配線された ServiceStack サービス (ま​​たはその他の IOC 依存関係) のみを取得できます。

var authService = AppHostBase.Resolve<AuthService>();
authService.RequestContext = System.Web.HttpContext.Current.ToRequestContext();

別のサービスの自動配線実装を解決するための推奨コードは次のとおりですが、

using (var authAservice = AppHostBase.ResolveService<AuthService>()) {
    ...
}

つまり、サービスは、破棄する必要があるリソースを利用する可能性があります。ServiceStack サービス内では、代わりに使用する必要がありますbase.ResolveService<AuthService>()

したがって、ServiceStack が MVC と同じ AppDomain 内でホストされている場合は、次のように Service ディレクトリを呼び出すことができます。

var authResponse = authService.Authenticate(new Auth {
    provider = "credentials",
    UserName = user.user_id,
    Password = user.password,
    RememberMe = true
});

Remote ServiceStack インスタンスによる認証

それ以外の場合は、 ServiceStack の C# Service Clients のいずれかを使用する必要があります。

var client = new JsonServiceClient(ServiceStackBaseUrl);
var authResponse = client.Post(new Auth {
    provider = "credentials",
    UserName = user.user_id,
    Password = user.password,
    RememberMe = true
});

元の MVC 要求に ServiceStack SessionId をアタッチする

これにより、ServiceClient クライアントとの認証済みセッションがss-pidCookie にアタッチされてセットアップされます (詳細については、 Session docsを参照してください)。この Cookie を介して、MVC を呼び出した元のブラウザーに渡すことができます。

var response = HttpContext.Current.Response.ToResponse();
response.Cookies.AddSessionCookie(
    SessionFeature.PermanentSessionId, authResponse.SessionId);

認証されたセッションでの後続のリクエスト

MVC 内からリモートの認証済み ServiceStack セッションに再アタッチするには、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);

Web.Config で、Cookie ドメインをグローバルに設定できます。

<httpCookies domain="mydomain.com" />

または実行時に:

cookie.Domain = "mydomain.com";

ServiceStack AuthTests.cs 統合テストには、ServiceStack で認証がどのように機能するかを示すその他の有用な例がいくつかあります。

于 2013-10-03T16:36:01.143 に答える