【问题标题】:Set the Authentication Token Profile Header设置身份验证令牌配置文件标头
【发布时间】:2017-08-12 14:55:17
【问题描述】:

我有一个我正在连接的 OpenIdConnect 服务器,我想在第一次登录时转发令牌数据以存储在服务器上。目前我这样做是为了转发访问令牌

var xhr = new XMLHttpRequest();
xhr.open("GET", url);
xhr.onload = function () {
    log(xhr.status, JSON.parse(xhr.responseText));
}
xhr.setRequestHeader("Authorization", "Bearer " + user.access_token);
xhr.send();

我也想发送配置文件数据,但我不知道正确的标题。 我该怎么做这样的事情:

xhr.setRequestHeader("Authorization-Profile", "Bearer " + user.profile);

有谁知道正确的标头,所以我可以将这些声明添加到访问令牌中。

【问题讨论】:

  • 服务器是否接受请求标头中的用户配置文件?配置文件数据通常在请求正文中传递。
  • @TejSoft 可以举个例子吗

标签: c# oauth-2.0 openid-connect identityserver4


【解决方案1】:

以下是我们在其中一个项目中所做的示例:

创建了一个通用的 API 响应类如下:

public class ApiCommonResponse
{
    public object Object { get; set; }
    public int httpStatus { get; set; }
    public string httpErrorMessage { get; set; }
}

以及调用 GET 和 POST API 端点的通用方法。此方法会将响应映射到提供的数据模型并返回对象。

public static ApiCommonResponse GetApiData<T>(string token, T dataModel, string apiEndPoint = null)
{
    var responseText = "";
    var apiCommonResponse = new ApiCommonResponse();
    if (apiEndPoint != null)
    {
        var request = (HttpWebRequest)WebRequest.Create(apiEndPoint);
        request.Method = "GET";
        request.ContentType = "application/json";
        request.Headers.Add("Authorization", "Bearer " + token);
        request.Headers.Add("X-Api-Version", "");
        try
        {
            var httpResponse = (HttpWebResponse)request.GetResponse();
            var stream = httpResponse.GetResponseStream();
            if (stream != null)
            {
                using (var streamReader = new StreamReader(stream))
                {
                    responseText = streamReader.ReadToEnd();
                }
            }
        }
        catch (WebException we)
        {
            var stream = we.Response.GetResponseStream();
            if (stream != null)
            {
                var resp = new StreamReader(stream).ReadToEnd();
                dynamic obj = JsonConvert.DeserializeObject(resp);
                throw new Exception(obj.ToString());
            }
        }
    }

    var jsonSettings = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Ignore };
    apiCommonResponse.Object = JsonConvert.DeserializeObject<T>(responseText, jsonSettings);
    apiCommonResponse.httpStatus = 0;
    return apiCommonResponse;
}

public static ApiCommonResponse PostApiData<T>(string username, string token, T dataModel, string apiEndPoint = null)
{
    var apiCommonResponse = new ApiCommonResponse();

    if (apiEndPoint == null) return null;

    var webRequest = WebRequest.Create(apiEndPoint);
    webRequest.Method = "POST";
    webRequest.Timeout = 20000;
    webRequest.ContentType = "application/json";
    request.Headers.Add("Authorization", "Bearer " + token);
    webRequest.Headers.Add("X-Api-Version", "");

    using (var requeststreams = webRequest.GetRequestStream())
    {
        using (var sw = new StreamWriter(requeststreams))
        {
            sw.Write(JsonConvert.SerializeObject(dataModel));
        }
    }
    try
    {
        var httpStatus = (((HttpWebResponse)webRequest.GetResponse()).StatusCode);
        var httpMessage = (((HttpWebResponse)webRequest.GetResponse()).StatusDescription);
        using (var s = webRequest.GetResponse().GetResponseStream())
        {
            if (s == null) return null;

            using (var sr = new StreamReader(s))
            {
                var responseObj = sr.ReadToEnd();
                if (!string.IsNullOrEmpty(responseObj))
                {
                    apiCommonResponse = JsonConvert.DeserializeObject<ApiCommonResponse>(responseObj);
                }
            }
            apiCommonResponse.httpStatus = (int)httpStatus;
            apiCommonResponse.httpErrorMessage = httpMessage;
            apiCommonResponse.Object = apiCommonResponse.Object;

        }
    }
    catch (WebException we)
    {
        var stream = we.Response.GetResponseStream();
        if (stream != null)
        {
            var resp = new StreamReader(stream).ReadToEnd();
            dynamic obj = JsonConvert.DeserializeObject(resp);
            throw new Exception(obj.ToString());
        }
    }
    return apiCommonResponse;
}

【讨论】:

  • 我给出的示例展示了如何获取和发布数据以及标头中的不记名令牌。现在,问题是服务器如何期望用户配置文件?一种选择是调用 POST api 并在正文中提供用户配置文件。
  • 我正在尝试将此与其他声明一起阅读,以便我可以访问名称等
  • 如果我必须单独创建它,我可以创建一个 webapi 端点
  • 我不确定您在这里的要求。身份服务器本身就是用户配置文件的来源。我曾经从身份服务器本身获取用户配置文件,而不是相反。如果需要将用户数据发送到 ID 服务器,那么最好将其作为 post 数据发送。
  • 我猜但是我必须在客户端解析它而不是仅仅传递它
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
相关资源
最近更新 更多