同じHTTPベアラトークンが2つの異なるAPIキープロバイダをサポートする必要があるため、複数のAPI Key Authプロバイダをサポートしようとすると問題が発生します。
組み込みのApiKeyAuthProviderは、ユーザーAPIのキー用であり、ユーザーはAPIキーの1つを使用して認証することができます。
私たちの最初の考えは、ユーザーに結びついているAuthProviderとして統合するのではなく、これをリクエストフィルターの制限として実装することです。例えば、
あなたは、あなたのサービスに生成することができます
public class ValidateCompanyKeyAttribute : RequestFilterAttribute
{
public override void Execute(IRequest req, IResponse res, object responseDto)
{
var companyKey = req.Headers["X-Company-Key"];
var company = GetValidCopmany(companyKey);
if (company == null)
{
res.StatusCode = (int)HttpStatusCode.Unauthorized;
res.EndRequest();
return;
}
req.Items["company"] = company; //if info needed in Services
}
}
:だから私は、おそらくカスタムX-Company-Key
HTTPヘッダーを追加し、会社のキー、たとえばを検証するために要求フィルター属性を追加するような何かをするだろう
[ValidateCompanyKey]
public class CompanyServices : Service { ... }
代替のアプローチは、すべての会社のAPIキーを保持し、どの会社がキーがApiKeyテーブルcustom ref data propertiesのいずれかを使用するためのものであることを維持するプレースホルダとして特別な「会社」ユーザーを作成することです。もちろん独自のカスタムAPI Key AuthProviderを作成している場合は、独自の明示的なフィールドを追加できます。このアプローチの利点は、同じ認証プロバイダーを使用してユーザーと企業APIキーの両方を検証できることです。 JWTのを使用すると、中に収まるようにどこ
[Authenticate]
public class UserServices : Service { ... }
わからない、HTTPリクエストのみを含めることができます。
はあなただけで、
ApiKeyAuthProvider
を既存のServiceStackの
[Authenticate]
属性ビルトイン例えば使用できるAPIキーを経由してユーザーを検証するには1のベアラトークンを取得し、APIキーを使用して認証している場合は、JWTを使用して認証することはありません。もちろん、両方のAuthProvidersを登録して、ユーザが自分の好みを使って認証できるようにすることもできます。
お返事ありがとうございます。まず、私はJWTがどのように機能しているのか誤解し、この解決策の一部ではないことを認識しました。 カスタムリクエストフィルタとhmac認証方式を実装しました。私はいくつかのカスタムヘッダー(appId、署名、apiKey)を使用します。呼び出し側のアプリケーションは、保持している秘密鍵に基づいて署名を作成します。これにより、サーバは、彼らが(何らかの理由でも)と言っている人であることをサーバが検証できるようになります。また、ApiAuthenticationが組み込まれているのではなく、ヘッダーにユーザーのapiキーが含まれています。 最後の部分を変更して調べる必要があるかもしれません。 – tracstarr