我已经看到了很多关于通过 POST 标头/请求正文进行 OAuth 用户身份验证以及令牌身份验证的解决方案。但我想问一下如何通过插入 url 来实现令牌身份验证?是关于控制器的吗?例如,如果原始端点 api.mysite.com/action,我想让它变得 api.mysite.com/tokenSOMETOKENHERE/action
如果令牌错误/未给出,请响应自定义的未授权响应。
这个想法来自Telegram的机器人API。令牌被传递到 URL,以便人们可以使用 HTTP GET 请求而不是 POST。
您可以设置与令牌模板的路由通信,并添加过滤器以获取令牌值并使用令牌(即身份验证(执行操作
路由配置,
routes.MapRoute(
name: "Default",
url: "{token}/{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
认证过滤器类,
public class TokenAuthenticationFilter : ActionFilterAttribute, IAuthenticationFilter
{
public void OnAuthentication(AuthenticationContext filterContext)
{
string token = Convert.ToString(filterContext.RouteData.Values["token"]);
// do your authentication stuff
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
throw new NotImplementedException();
}
}
过滤器装饰到控制器,
[TokenAuthenticationFilter]
public class HomeController : Controller
如果你想使用任何使用http标头来传输令牌的内置授权插件,你实际上可以从url读取令牌并使用Owin服务将其传输到正确的标头,以便操作对AuthorizationFilter是透明的。
将令牌从查询移动到标头的示例:
public void ConfigureAuth(IAppBuilder app)
{
app.Use(async (context, next) =>
{
if (context.Request.QueryString.HasValue)
{
if (string.IsNullOrWhiteSpace(context.Request.Headers.Get("Authorization")))
{
string token = context.Request.Query.Get("auth");
if (!string.IsNullOrWhiteSpace(token))
{
context.Request.Headers.Add("Authorization", new[] { string.Format("Bearer {0}", token) });
}
}
}
await next.Invoke();
});
//rest of the method
}