Web API 以 XML 形式返回 OAuth 令牌

2023-11-23

使用具有单个用户帐户的默认 Visual Studio 2013 Web API 项目模板,并使用 application/xml 的 Accept 标头发布到 /token 端点,服务器仍然以 JSON 形式返回响应:

{"access_token":"...","token_type":"bearer","expires_in":1209599}

有没有办法以 XML 形式获取令牌?


根据RFC6749响应格式应为 JSON,并且 Microsoft 相应地实现了它。我发现 JSON 格式是在Microsoft.Owin.Security.OAuth.OAuthAuthorizationServerHandler没有扩展手段的内部类。

我还遇到了需要在 XML 中进行令牌响应的情况。 我想出的最佳解决方案是在 Accept 标头中声明时实现 HttpModule 将 JSON 转换为 XML。

public class OAuthTokenXmlResponseHttpModule : IHttpModule
{
    private static readonly string FilterKey = typeof(OAuthTokenXmlResponseHttpModule).Name + typeof(MemoryStreamFilter).Name;

    public void Init(HttpApplication application)
    {
        application.BeginRequest += ApplicationOnBeginRequest;
        application.EndRequest += ApplicationOnEndRequest;
    }

    private static void ApplicationOnBeginRequest(object sender, EventArgs eventArgs)
    {
        var application = (HttpApplication)sender;

        if (ShouldConvertToXml(application.Context.Request) == false) return;

        var filter = new MemoryStreamFilter(application.Response.Filter);
        application.Response.Filter = filter;
        application.Context.Items[FilterKey] = filter;
    }

    private static bool ShouldConvertToXml(HttpRequest request)
    {
        var isTokenPath = string.Equals("/token", request.Path, StringComparison.InvariantCultureIgnoreCase);
        var header = request.Headers["Accept"];

        return isTokenPath && (header == "text/xml" || header == "application/xml");
    }

    private static void ApplicationOnEndRequest(object sender, EventArgs eventArgs)
    {
        var context = ((HttpApplication) sender).Context;

        var filter = context.Items[FilterKey] as MemoryStreamFilter;
        if (filter == null) return;

        var jsonResponse = filter.ToString();
        var xDocument = JsonConvert.DeserializeXNode(jsonResponse, "oauth");
        var xmlResponse = xDocument.ToString(SaveOptions.DisableFormatting);

        WriteResponse(context.Response, xmlResponse);
    }

    private static void WriteResponse(HttpResponse response, string xmlResponse)
    {
        response.Clear();
        response.ContentType = "application/xml;charset=UTF-8";
        response.Write(xmlResponse);
    }

    public void Dispose()
    {
    }
}

public class MemoryStreamFilter : Stream
{
    private readonly Stream _stream;
    private readonly MemoryStream _memoryStream = new MemoryStream();

    public MemoryStreamFilter(Stream stream)
    {
        _stream = stream;
    }

    public override void Flush()
    {
        _stream.Flush();
    }

    public override int Read(byte[] buffer, int offset, int count)
    {
        return _stream.Read(buffer, offset, count);
    }

    public override void Write(byte[] buffer, int offset, int count)
    {
        _memoryStream.Write(buffer, offset, count);
        _stream.Write(buffer, offset, count);
    }

    public override string ToString()
    {
        return Encoding.UTF8.GetString(_memoryStream.ToArray());
    }

    #region Rest of the overrides
    public override bool CanRead
    {
        get { throw new NotImplementedException(); }
    }

    public override bool CanSeek
    {
        get { throw new NotImplementedException(); }
    }

    public override bool CanWrite
    {
        get { throw new NotImplementedException(); }
    }

    public override long Seek(long offset, SeekOrigin origin)
    {
        throw new NotImplementedException();
    }

    public override void SetLength(long value)
    {
        throw new NotImplementedException();
    }

    public override long Length
    {
        get { throw new NotImplementedException(); }
    }

    public override long Position
    {
        get
        {
            throw new NotImplementedException();
        }
        set
        {
            throw new NotImplementedException();
        }
    }
    #endregion
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web API 以 XML 形式返回 OAuth 令牌 的相关文章

  • 在 ServiceStack 中使用 ASP.NET 成员资格

    我该如何使用ASP NET 会员资格 in 服务栈 http www servicestack net ServiceStack OrmLite ServiceStack Host AspNet 等 您可以将 ServiceStack 托管
  • 是否可以使用相同的客户端凭据拥有多个有效的访问令牌?

    我有一个使用 OAuth2 身份验证的 API 设置 客户已使用 WSO2 订阅了我的 API 我们不使用刷新令牌 所有访问令牌将在 1 小时后过期 如果我的客户端使用相同的客户端凭据请求 2 个访问令牌 会发生什么情况 第一个令牌会被撤销
  • 将base64字符串转换为图像c#时出错

    我想在我的网页上显示图像 并单击应该下载的链接按钮 存储的图像文件以二进制格式存储在db中 将 base64 字符串转换为图像时显示错误 详细信息如下 帮助我找到合适的解决方案 谢谢 Error Code protected void Pa
  • ASP.NET GridView 默认排序顺序

    我有一个绑定到 sql 数据源的简单 gridview 控件 现在我启用了排序 但是当我单击要排序的列时 它首先按升序对其进行排序 当我再次单击同一列时 它会按降序排序 我想改变这一点 我希望它在第一次单击时按降序排序 在第二次单击时按升序
  • bin 文件夹内任何文件的任何更改是否会导致 ASP.NET Web 应用程序中的应用程序回收?

    我知道在 ASP NET Web 应用程序中 更改位于bin文件夹会导致应用程序回收 但我想知道 正如主题所暗示的那样 是否any文件更改会导致这种行为吗 此场景中是否包含简单的文本文件 那么子文件夹呢 bin文件夹 它们的内容呢 我知道我
  • Google OAuth 2 和状态参数值需要在重定向 url 中注册

    根据 Google Oauth 2 0 文档的状态参数 指示收到响应后可能对您的应用程序有用的任何状态 Google 授权服务器会往返此参数 因此您的应用程序会收到与发送的值相同的值 可能的用途包括将用户重定向到站点中的正确资源 随机数和跨
  • DropDownList 有一个无效的 SelectedValue,因为它不存在于项目列表中

    这是场景 DropDownList 中的选择与列出可接受值的数据库表绑定 在某个时间点 这些值为 一 二 三 四 在稍后的某个时刻 可接受的值列表将更改为 一 二 四 五 但是 数据库中存储下拉列表值的字段在某些行上仍然包含值 三 加载其中
  • 如何使用 JavaScript 或 jQuery 清除 Google Chrome、Mozilla Firefox 和 Safari 中的剪贴板数据

    我正在开发一个网站 我想在使用 JavaScript 或 jQuery 查看我的网站时按下打印屏幕按钮时清除剪贴板数据 谁能帮我解决这个问题 我在 Internet Explorer 中成功处理了这个问题 提前致谢 由于安全原因 您无法使用
  • ADO.NET 池连接无法重用

    我正在开发一个 ASP NET MVC 应用程序 该应用程序使用 EF 6 x 来处理我的 Azure SDL 数据库 最近 随着负载的增加 应用程序开始进入无法再与 SQL 服务器通信的状态 我可以看到有 100 个到我的数据库的活动连接
  • 无需登录即可在 Intranet 上获取 Web 应用程序的域\用户名

    我的 Intranet 上有一个 Web 应用程序 VS 2005 有几个页面不需要用户登录应用程序 反馈和默认页面 我正在尝试获取要显示和 或发送反馈的域名和用户名 有没有一种方法可以在不需要用户登录的情况下执行此操作 我试过了this
  • 如果项目包含多个文件夹,如何使用 Add-Migration

    我想Add Migration使用我的 DbContext 但出现错误 The term add migration is not recognized as the name of a cmdlet function script fil
  • 使用 ASP.Net 和 Ajax 的登录页面

    我正在尝试使用 html ajax 和 ASP NET 制作登录页面 数据确实传递给 ajax 函数 但是当我调试 asp 页面时 用户名和密码以 NULL 发送 该代码应该获取用户名和密码 然后返回用户 ID html页面 div Use
  • 如何使用 linq 通过主键组合三个对象列表

    我正在尝试合并 3 个对象列表 我有一个人员列表 地址列表和地址关系列表 我想将这些列表组合成一个按 person id 排序的新列表 将其用作列表视图的数据源 然后能够访问 aspx 页面中的属性 这可能吗 Roughly using S
  • 如何从网站的 .NET 安装程序中排除文件夹?

    我们的网站有一个安装程序 效果很好 我在创建安装程序时排除了 web config 和其他一些文件 但是我似乎无法排除文件夹 这可能吗 我已使用 NET 内置 Web 安装项目创建了安装程序 该项目可在新项目对话框中的 Visual Stu
  • 多线程 Web 应用程序

    我知道有很多情况都是在应用程序中使用多线程的好例子 但是什么时候最好在 net Web 应用程序中使用多线程 Web 应用程序几乎肯定已经由托管环境 IIS 等 实现多线程化 如果您的页面受 CPU 限制 并且想要使用多个核心 那么可以说多
  • SignalR 的浏览器兼容性如何?

    我在网上找到的最多的是 SignalR FAQ 其中指出 SignalR 在 IE6 7 中不起作用 但是 出于法律原因 我需要向客户提供受支持的浏览器列表 SignalR 有这样的经过测试的浏览器列表吗 Thanks 看起来微软已经发布了
  • 通过 JavaScript 单击按钮/页面提交

    我想了解 asp net 框架如何知道何时单击了按钮 因此一旦收到请求 就会在服务器上触发其单击事件 我需要了解它是如何工作的 因为我想从 JavaScript 触发按钮的服务器单击事件 我能够从 JavaScript 执行页面提交 doc
  • 作出选择之后、提交上传之前的 asp.net FileUpload 事件

    我想显示通过 FileUpload 控件的浏览按钮选择的文件的大小 理想情况下 该值在用户选择文件后但在单击 上传文件 按钮之前立即显示 我有一个网络表格 按钮看起来像这样
  • Oauth2中如何同时撤销RefreshToken和使AccessToken失效

    我正在使用 Owin Oauth2 授权和资源服务器相同 开发单页面应用程序 AngularJS Net MVC Json Rest API 的身份验证流程 我选择了 Bearer Token 路由而不是传统的 cookie session
  • 正则表达式仅允许特定数字

    我正在寻找一个只允许输入特定数字的正则表达式 例如2 4 5 6 10 18 我尝试过类似的东西 2 4 5 6 10 18 我输入的任何内容都无法通过正则表达式 然后计算机用手指着我并大笑 我哪里出错了 单引号是不必要的 您正在寻找的正则

随机推荐