我已经看到很多关于通过POST标头/请求体进行OAuth用户身份验证和令牌身份验证的解决方案。但我想问一下如何通过插入url来实现令牌身份验证?这是关于控制器的吗? 例如,如果原始端点是api.mysite.com/action,我想让它成为api.mysite.com/tokenSOMETOKENHERE/action
如果令牌错误/未给出,请回复自定义未经授权的回复。
这个想法来自Telegram's bot API。令牌将传递给URL,以便人们可以使用HTTP GET请求而不是POST。
答案 0 :(得分:2)
您可以使用令牌模板设置路由配置,并添加过滤器以获取令牌值并使用令牌(即身份验证)执行您的操作
路线配置,
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
答案 1 :(得分:0)
如果您想使用任何使用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
}