如何根据Web API/Asp.Net Identity验证HTML-5音频下载请求?

Abh*_*eet 9 html5 html5-audio asp.net-web-api owin asp.net-identity

我需要从我的Web API流式传输音频.在标准HTML-5中,音频src属性设置为来自WebAPI的音频的URI.

问题是:使用Asp.Net Identity保护的Web API要求在标头中传递承载令牌,但HTML AUDIO TAG不允许我们这样做.我最终被遗漏了两个选择:

方法1.使用XHR请求下载HTML并在本地播放.

方法2.通过查询字符串传递标题.这样我们就可以在请求处理期间的时间点将令牌注入OWIN管道.

上面提到的第一种方法是不可行的,因为如果我们在本地下载音频,我们将错过Web API提供的流功能.

你可以请求方法2,即在Web API方面,我们可以从URL读取承载令牌,然后启动Asp.Net身份验证吗?

Den*_*sır 4

创建这个提供者类

public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
    public override Task RequestToken(OAuthRequestTokenContext context)
    {
        var value = context.Request.Query.Get("access_token");

        if (!string.IsNullOrEmpty(value))
        {
            context.Token = value;
        }

        return Task.FromResult<object>(null);
    }
}
Run Code Online (Sandbox Code Playgroud)

在 Startup.cs 中使用它

OAuthOptions = new OAuthAuthorizationServerOptions
{
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
    AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
    // In production mode set AllowInsecureHttp = false
    AllowInsecureHttp = true                
};

// Enable the application to use bearer tokens to authenticate users

//app.UseOAuthBearerTokens(OAuthOptions);   // old line

app.UseOAuthAuthorizationServer(OAuthOptions); // new line

// Enable the application to retrieve tokens from query string to authenticate users
app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
{
    Provider = new QueryStringOAuthBearerProvider()
});
Run Code Online (Sandbox Code Playgroud)

现在它将从 url“..../?access_token=xxxxxxx”获取令牌,并尝试进行验证。