iOS设备检查-服务器端C#.net解决方案(JWT)

iOS设备检查-服务器端C#.net解决方案(JWT),c#,ios,.net,swift,jwt,C#,Ios,.net,Swift,Jwt,在iOS上设置DeviceCheck非常简单,但是使用C#实现服务器端非常困难,因为几乎没有任何示例,并且需要一些复杂的JWT代码,这些代码必须绝对完美才能工作。有人有解决方案吗?这是一个完整的解决方案。我从p8文件中去掉了第一行和最后一行,例如“key start here”(或其他什么),还去掉了所有新行,因此key只是一条长行 static void Main(string[] args) { string deviceToken = ""; //you get

在iOS上设置DeviceCheck非常简单,但是使用C#实现服务器端非常困难,因为几乎没有任何示例,并且需要一些复杂的JWT代码,这些代码必须绝对完美才能工作。有人有解决方案吗?

这是一个完整的解决方案。我从p8文件中去掉了第一行和最后一行,例如“key start here”(或其他什么),还去掉了所有新行,因此key只是一条长行

static void Main(string[] args)
{
    string deviceToken = ""; //you get this from the device
    string transcationId = Guid.NewGuid().ToString();

    var payload = new Dictionary<string, object>() {
        { "device_token", deviceToken },
        { "timestamp", DateTimeOffset.UtcNow.ToUnixTimeSeconds() * 1000 },
        { "transaction_id", transcationId }
    };

  
    var token = GetProviderToken();
    var payloadJson = JsonConvert.SerializeObject(payload);

    using (var httpClient = new HttpClient())
    {
        using (var request = new HttpRequestMessage(new HttpMethod("POST"), "https://api.development.devicecheck.apple.com/v1/query_two_bits"))
        {
            request.Headers.TryAddWithoutValidation("Authorization", $"Bearer {token}");

            request.Content = new StringContent(payloadJson);
            request.Content.Headers.ContentType = MediaTypeHeaderValue.Parse("application/x-www-form-urlencoded");

            var response = httpClient.SendAsync(request).Result;                    
            Console.WriteLine(response);
            Console.WriteLine(response.Content.ReadAsStringAsync().Result);
        }
    }
}

private static CngKey GetPrivateKey()
{
    using (var reader = File.OpenText(@".\applekey.p8.txt"))
    {
        var ecPrivateKeyParameters = (ECPrivateKeyParameters)new PemReader(reader).ReadObject();
        var x = ecPrivateKeyParameters.Parameters.G.AffineXCoord.GetEncoded();
        var y = ecPrivateKeyParameters.Parameters.G.AffineYCoord.GetEncoded();
        var d = ecPrivateKeyParameters.D.ToByteArrayUnsigned();
        return EccKey.New(x, y, d);
    }
}

private static string GetProviderToken()
{
    var epochNow = (int)DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
    var payload = new Dictionary<string, object>()
    {
        {"iss", "<10 DIGIT TEAM CODE FROM APPLE DEV CENTER>"},
        {"iat", epochNow}
    };
    var extraHeaders = new Dictionary<string, object>()
    {
        {"kid", "<THE NAME OF THE P8 FILE, 10 DIGITS>"}
    };
    var privateKey = GetPrivateKey();
    return JWT.Encode(payload, privateKey, JwsAlgorithm.ES256, extraHeaders);
}
static void Main(字符串[]args)
{
string deviceToken=“;//您可以从设备获取此信息
字符串TransactionId=Guid.NewGuid().ToString();
var payload=newdictionary(){
{“设备令牌”,设备令牌},
{“timestamp”,DateTimeOffset.UtcNow.ToUnixTimeSeconds()*1000},
{“事务id”,TransactionID}
};
var token=GetProviderToken();
var payloadJson=JsonConvert.SerializeObject(有效负载);
使用(var httpClient=new httpClient())
{
使用(var request=newhttprequestmessage(newhttpmethod(“POST”),”https://api.development.devicecheck.apple.com/v1/query_two_bits"))
{
request.Headers.TryAddWithoutValidation(“Authorization”、$“Bearer{token}”);
request.Content=newstringcontent(payloadJson);
request.Content.Headers.ContentType=MediaTypeHeaderValue.Parse(“application/x-www-form-urlencoded”);
var response=httpClient.SendAsync(请求).Result;
控制台写入线(响应);
Console.WriteLine(response.Content.ReadAsStringAsync().Result);
}
}
}
私有静态CngKey GetPrivateKey()
{
使用(var reader=File.OpenText(@.\applekey.p8.txt))
{
var ecPrivateKeyParameters=(ecPrivateKeyParameters)new PemReader(reader.ReadObject();
var x=ecPrivateKeyParameters.Parameters.G.AffineXCoord.GetEncoded();
var y=ecPrivateKeyParameters.Parameters.G.AffineYCoord.GetEncoded();
var d=ecPrivateKeyParameters.d.ToByteArrayUnsigned();
返回EccKey.New(x,y,d);
}
}
私有静态字符串GetProviderToken()
{
var epochNow=(int)DateTime.UtcNow.Subtract(newdatetime(1970,1,1)).TotalSeconds;
var payload=newdictionary()
{
{“iss”,“},
{“iat”,epochNow}
};
var extraHeaders=newdictionary()
{
{“孩子”,“}
};
var privateKey=GetPrivateKey();
返回JWT.Encode(有效负载、privateKey、JwsAlgorithm.ES256、extraHeader);
}