サービス機能のプラグインの代わりにサービス機能がありますか?いくつかのシナリオでは、サービスの実装で承認されたセッションに一致するCookieを使用できません。要求のhttpヘッダーのトークンを使用してセッションを解決する可能性はありますか?ブラウザがクッキーをブロックしている場合に、そのための推奨ソリューションは何ですか?クッキーベースのセッション/認証に代わるもの
答えて
私は、組み込みの認証プロバイダとセッションプロバイダなしで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なしで認証をサポートできます。
@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);
}
});
}
}
- 1. C#クッキーベースの認証
- 2. クッキーベースのセッションのセキュリティ
- 3. 認証のためにClientLoginに代わるもの
- 4. ポップアップの代わりにリダイレクトによる認証ページ内の認証
- 5. viewsの代わりにセッション
- 6. PHPセッション変数に代わるものは何ですか?
- 7. QGLViewerに代わるもの
- 8. setAttributeに代わるもの
- 9. pplに代わるもの
- 10. ツリービューに代わるもの
- 11. JqueryUIに代わるもの?
- 12. セッション/認証ループ
- 13. facebook iframe - ポップアップ認証の代わりにFacebookのロゴを取得
- 14. リダイレクトの代わりに認証後にJavascriptを実行
- 15. Asana API:認証にAPIキーを使用する代わりに?
- 16. ログインページにリダイレクトする代わりにWeb API認証を返す
- 17. 認証:ホームページの代わりにapp_dev.php/_wdt/511509b611682
- 18. node-http-proxy経由のクッキーベースのセッションを維持する
- 19. PHP APIの認証とセッション
- 20. セッションの固定 - フォーム認証
- 21. セッションの代わりにhmacベースのクライアントデータ検証を使用しますか?
- 22. AndroidのJUnitに代わるもの
- 23. デフォルトのdjangoテンプレートシステムに代わるもの
- 24. VimのNERDTreeに代わるもの
- 25. メモリデータベースのTimesTenに代わるもの
- 26. iOS用のffmpegに代わるもの
- 27. nodejsのドメインに代わるもの
- 28. SilverlightのHttpWebRequest.ProtocolVersionに代わるもの
- 29. 要素のオンロードに代わるもの
- 30. mod_pythonのCGIハンドラに代わるもの
おかげで動作し、これは、私の認証呼び出しで返されたセッションIDを取ることを可能にするために角度Ajaxを介して、私のCORSの実装の最後の作品/でした対応するAjax呼び出しでカスタムヘッダーとして追加し、標準のCookieが必要なときにヘッダーを取るカスタム認証プロバイダーをサービススタックに作成する必要はありません。 –