2013-05-22 10 views
7

サービス機能のプラグインの代わりにサービス機能がありますか?いくつかのシナリオでは、サービスの実装で承認されたセッションに一致するCookieを使用できません。要求のhttpヘッダーのトークンを使用してセッションを解決する可能性はありますか?ブラウザがクッキーをブロックしている場合に、そのための推奨ソリューションは何ですか?クッキーベースのセッション/認証に代わるもの

答えて

7

私は、組み込みの認証プロバイダとセッションプロバイダなしでServiceStackを使用しています。

属性をリクエストフィルタとして使用して、Cookie、リクエストヘッダー、または文字列パラメータからユーザー情報(IDとトークン)を収集します。 この情報は、ユーザーがログインした後に入力できます。レスポンスに新しいクッキーを追加し、ビューのレンダリング時にクライアントサイドにIDとトークン情報を注入すると、httpヘッダーとリンクのクエリパラメータに使用できます。

public class AuthenticationAttribute : Attribute, IHasRequestFilter 
{ 
    public void RequestFilter(IHttpRequest request, IHttpResponse response, object dto) 
    { 
     var userAuth = new UserAuth { }; 
     if(!string.IsNullOrWhiteSpace(request.GetCookieValue("auth")) 
     { 
      userAuth = (UserAuth)request.GetCookieValue("auth"); 

     } 
     else if (!string.IsNullOrEmpty(request.Headers.Get("auth-key")) && 
      !string.IsNullOrEmpty(request.Headers.Get("auth-id"))) 
     { 
      userAuth.Id = request.Headers.Get("id"); 
      userAuth.Token = request.Headers.Get("token"); 
     } 
     authenticationService.Authenticate(userAuth.Id, userAuth.token); 
    } 
    public IHasRequestFilter Copy() 
    { 
     return new AuthenticationAttribute(); 
    } 
    public int Priority { get { return -3; } } // negative are executed before global requests 
} 

ユーザーが権限を与えられていない場合、私はこの時点で彼をリダイレクトします。

私のプロジェクトはSPAをサポートしています。ユーザーがxmlhttprequestsでAPIを使用する場合、認証の処理はヘッダーで行われます。その情報がAngularJSに読み込まれ、ページが読み込まれ、すべてのリクエスト(部分的なビュー、API消費など)で再利用されます。 ServiceStackはこのタイプのものには強力です。AngularJSアプリケーションとServiceStackビューエンジンを簡単に設定して、すべての要求を検証したり、アプリケーションをグローバル化したりすることができます。

リクエストがjavascriptによって呼び出されない場合、IDとトークンをクエリパラメータとして渡すリンクを常に生成し、フォーム上の隠れた入力にそれらを渡すと、Cookieなしで認証をサポートできます。

4

@Guilherme Cardoso:現在のソリューションでは、PreRequestFiltersと組み込みのセッション機能を使用しています。

マイワークフロー/回避策は以下の通りです:

ユーザーが、私はクッキーを取り、HTTPヘッダを使用して、クライアントに送信し、許可を取得します

。クッキーがリクエストのhttpヘッダー(Authorization)に設定されている場合、クライアントはサービスを呼び出すことができます。

これを達成するために、PreRequestFilterを使用して、偽装された認証ヘッダーをリクエストのCookieにリダイレクトします。セッション機能を使用できるようになりました。ハックのように感じているが、このための瞬間;-)

public class CookieRestoreFromAuthorizationHeaderPlugin : IPlugin 
{ 
    public void Register(IAppHost appHost) 
    { 
     appHost.PreRequestFilters.Add((req, res) => 
      { 
       var cookieValue = req.GetCookieValue("ss-id"); 

       if(!string.IsNullOrEmpty(cookieValue)) 
        return; 

       var authorizationHeader = req.Headers.Get("Authorization"); 

       if (!string.IsNullOrEmpty(authorizationHeader) && authorizationHeader.ToLower().StartsWith("basictoken ")) 
       { 
        var cookie = Encoding.UTF8.GetString(Convert.FromBase64String(authorizationHeader.Split(' ').Last())); 

        req.Cookies.Add("ss-id",new Cookie("ss-id",cookie)); 
        req.Items.Add("ss-id",cookie); 
       } 
      }); 
    } 
} 
+0

おかげで動作し、これは、私の認証呼び出しで返されたセッションIDを取ることを可能にするために角度Ajaxを介して、私のCORSの実装の最後の作品/でした対応するAjax呼び出しでカスタムヘッダーとして追加し、標準のCookieが必要なときにヘッダーを取るカスタム認証プロバイダーをサービススタックに作成する必要はありません。 –

関連する問題