0

私は認めようと思っているよりも長い間、これに苦労してきました。WebAutn を使用して新しいデバイスを登録しようとしています。私は少なくとも 2 つの異なる例を試し、多くの異なるコードを調べました。私はすべてを正しくやっているようです...しかし、何をしても同じ役に立たない例外が発生し続けます。私はウェブを精査しましたが、他の誰もこの例外を受け取っていないようですので、何が悪いのか本当にわかりませんか?

要するに、newCredential = await navigator.credentials.create({publicKey: options}); 「例外:TypeError: 'CredentialsContainer' で 'create' を実行できませんでした: 指定された値 '2' は AttestationConveyancePreference 型の有効な列挙値ではありません。」

以下は、 PublicKeyCredentialCreationOptionsが返され、私が提出しているものです。

{
    "rp": {
        "id": "someserver",
        "name": "IB-Fido2",
        "icon": null
    },
    "user": {
        "name": "fred@someserver.com",
        "id": {},
        "displayName": "Fred Sampson"
    },
    "challenge": {},
    "pubKeyCredParams": [
        {
            "type": 0,
            "alg": -7
        },
        {
            "type": 0,
            "alg": -257
        },
        {
            "type": 0,
            "alg": -37
        },
        {
            "type": 0,
            "alg": -35
        },
        {
            "type": 0,
            "alg": -258
        },
        {
            "type": 0,
            "alg": -38
        },
        {
            "type": 0,
            "alg": -36
        },
        {
            "type": 0,
            "alg": -259
        },
        {
            "type": 0,
            "alg": -39
        }
    ],
    "timeout": 60000,
    "attestation": 0,
    "authenticatorSelection": {
        "requireResidentKey": false,
        "userVerification": 1
    },
    "excludeCredentials": [],
    "extensions": null,
    "status": "ok",
    "errorMessage": ""
}

どんな助けや提案も大歓迎です!

更新:しばらくの間、オブジェクトをシリアル化/逆シリアル化してきました...しかし、ほとんどの場合、JavaScript ではなく C# を対象としています...したがって、この問題に遭遇するまで、JavaScript の String Enum について知りませんでした。これは変換エラーであることがわかりましたが、他の誰もエラーを報告していないため、Fido2NetLib が必要なオブジェクトを返さなければならないと誤って考えていました。

ありがたいことに、Newtonsoft.Json には、このカバーを非常に簡単に行うための拡張機能が既にありまし

したがって、最後に StringEnumConverter() を使用してオブジェクトをシリアル化し、それを json から作成したカスタム クラスに逆シリアル化する必要がありました。これはまったく同じですが、String Enum 値を使用します。Json を Blazor.Interop に渡すことが機能しなかったため、そのようにする必要がありました...実際のオブジェクトが必要でした。最後に、文字列列挙型で変換を行うためのよりクリーンな方法があると確信していますが、前進したいので、今のところそれを進めています。見る:

        string url = string.Format("{0}{1}", Endpoints.UsersFidoOptions, userId);
        var options = await userRepository.FidoOptions(url);

        if (options != null)
        {
            if (options.Status != "ok")
            {
                //Error Message
            }
            else
            {
                try
                {
                    // Serialize returned options: NOTE: String Enum Converter necessary as this object has JavaScript String Enum's
                    string json = JsonConvert.SerializeObject(options, new Newtonsoft.Json.Converters.StringEnumConverter());

                    // Next Deserialize into Custom Object to Compensate for String Enum's
                    var pubKey = Newtonsoft.Json.JsonConvert.DeserializeObject<PublicKey>(json);

                    // Now Serialize the Public Key for Session Storage
                    string pkJson = JsonConvert.SerializeObject(pubKey, new Newtonsoft.Json.Converters.StringEnumConverter());

                    await sessionStorage.SetItemAsync<string>("fido2.attestationOptions", pkJson);
                    await jsRuntime.InvokeVoidAsync("blazorInterop.registerOptions", pubKey);
                }
                catch (JSException e)
                {
                    string err = e.Message;
                }
            }
        }
4

1 に答える 1