【问题标题】:C# MVC API controller - token authentication in URL?C# MVC API 控制器 - URL 中的令牌身份验证?
【发布时间】:2018-01-20 23:20:53
【问题描述】:

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

如果令牌错误/未给出,则响应自定义的未经授权的响应。

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

【问题讨论】:

  • 你的意思是什么?是的,提取令牌的代码将在控制器中。一旦你得到了你想要的令牌响应,是什么阻止了你?

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


【解决方案1】:

您可以使用令牌模板设置路由配置,并添加过滤器以获取令牌值并使用令牌做您的事情(即身份验证)

路由配置,

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

【讨论】:

    【解决方案2】:

    如果你想使用任何内置的授权插件,它利用 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
    }
    

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 1970-01-01
      • 2021-02-08
      • 2019-09-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多