C# MVC API 控制器 - URL 中的令牌身份验证



我已经看到了很多关于通过 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
}

最新更新