0

私の目標は、独自のトークンでカスタムヘッダーを使用して、シグナルサービスに対してユーザーまたはマシンを認証することです。

この方法論を ASP.net WEB API の下でうまく使用して、独自のカスタム クレーム ベースの認証と承認を実行してきました。

私たちのWeb APIは次のとおりです。

protected void Application_Start()
{
        GlobalConfiguration.Configuration.MessageHandlers.Add(new AuthorizationHeaderHandler());

}

次に、Thread.CurrentPrincipal = principal; を上書きする AuthorizationHandler があります。これで完了です。

SignalR 内で実装しようとしました: 1. Authorize を使用してハブをマークします。 2. カスタム承認属性を実装しました。しかし、正しいヘッダーが送信された場合に true を返す以外に、生成したクレーム ベースのプリンシパルに Context.User を変更することはできません。

しかし、Context.User を取得して、ハブへの接続に使用されている実際のユーザーを表示することはできません。

どんな提案でも大歓迎です。

これを達成したい主な理由は、システムに接続するユーザー/マシンの種類がいくつかあるためです。

誰でも何か提案。

4

1 に答える 1

2

最後に解決策を見つけました。

独自の owin セキュリティ ミドルウェアを追加して、顧客のヘッダー ベースの認証を処理できるようにしました。

これは簡単に拡張でき、サービス内で複数の認証スキームを組み合わせることができます。

最初にカスタム認証ミドルウェアを作成します。

public class AuthenticationMiddleware : OwinMiddleware
{
    public AuthenticationMiddleware(OwinMiddleware next) :
        base(next) { }


    public override async Task Invoke(IOwinContext context)
    {
        var request = context.Request;
        var value = request.Headers["Phocabby-MachineKey"];
        var username = value;
        var usernameClaim = new Claim(ClaimTypes.Name, username);
        var identity = new ClaimsIdentity(new[] { usernameClaim }, "ApiKey");
        var principal = new ClaimsPrincipal(identity);
        principal.Identities.First().AddClaim(new Claim("CanGetApiKey", "False"));
        principal.Identities.First().AddClaim(new Claim("Cabinet", "True"));
        request.User = principal;
        await Next.Invoke(context);
    }
}

次に、スタートアップクラスに登録します

public void Configuration(IAppBuilder app)
{
    app.Use(typeof(AuthenticationMiddleware));
    app.MapSignalR();
}
于 2014-03-15T16:56:50.300 に答える