C#MVC API控制器 - URL中的令牌认证?

时间:2018-01-20 06:05:23

标签: c# asp.net-web-api

我已经看到很多关于通过POST标头/请求体进行OAuth用户身份验证和令牌身份验证的解决方案。但我想问一下如何通过插入url来实现令牌身份验证?这是关于控制器的吗? 例如,如果原始端点是api.mysite.com/action,我想让它成为api.mysite.com/tokenSOMETOKENHERE/action

如果令牌错误/未给出,请回复自定义未经授权的回复。

这个想法来自Telegram's bot API。令牌将传递给URL,以便人们可以使用HTTP GET请求而不是POST。

2 个答案:

答案 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
}