Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#WEB(RESTful)API 4.5路由Oauth2.0的正确/最智能的方式_C#_Api_Asp.net Web Api_Routing_Oauth 2.0 - Fatal编程技术网

C#WEB(RESTful)API 4.5路由Oauth2.0的正确/最智能的方式

C#WEB(RESTful)API 4.5路由Oauth2.0的正确/最智能的方式,c#,api,asp.net-web-api,routing,oauth-2.0,C#,Api,Asp.net Web Api,Routing,Oauth 2.0,我正在使用asp.NETWebAPI开发一个RESTfulWebAPI。当我开始实现Oauth2.0服务时,我发现了一个小的路由问题 例如: 我有3个控制器: public class A_Controller : ApiController { public string get() { return "call A controller"; } } public class A_Controller : ApiController { [Ac

我正在使用asp.NETWebAPI开发一个RESTfulWebAPI。当我开始实现Oauth2.0服务时,我发现了一个小的路由问题

例如:

我有3个控制器:

public class A_Controller : ApiController
{

    public string get()
    {
        return "call A controller";
    }
 }
public class A_Controller : ApiController
{
  [ActionName("Default")]
  [CustomAuthorize()]
  public string get()
  {
    return "Requested Data";
  }
}


它们都会返回一些信息

我想做的是:

对于默认呼叫:

.../api/{Controller}
继续进行基本身份验证

对于此呼叫:

.../api/oauth/{Controller}
继续我的Oauth实现

这必须适用于所有控制器

我尝试的是:

       config.Routes.MapHttpRoute(
            name: "OauthApi",
            routeTemplate: "api/oauth/{Controller}",
            defaults: new
            {
                token_num = RouteParameter.Optional,
                action = "Oauth"
            }
        );

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}",
            defaults: new
            {
                action = "Default"
            }
        );


public class A_Controller : ApiController
{
    [ActionName("Default")]
    public string get()
    {
        return "call withouth Oauth";
    }


    [ActionName("OauthAction")]
    public string getOauth()
    {
        //do some Oauth check
        return "Oauth with token in header!!!!";
    }


假设用户已经获得授权,我会这样做

创建您的路线:

config.Routes.MapHttpRoute(
  name: "OauthApi",
  routeTemplate: "api/oauth/{Controller}/{Action}",
  defaults: new
  {
    action = "Default"
  }
); 

// or if you have the token in the path..

config.Routes.MapHttpRoute(
  name: "OauthApi",
  routeTemplate: "api/oauth/{OAuthToken}/{Controller}/{Action}",
  defaults: new
  {
    action = "Default"
  }
); // This is really just for URL match, as the Token shouldn't be used
   // by the controller or action

config.Routes.MapHttpRoute(
  name: "DefaultApi",
  routeTemplate: "api/{Controller}/{Action}",
  defaults: new
  {
    action = "Default"
  }
);
控制器:

public class A_Controller : ApiController
{

    public string get()
    {
        return "call A controller";
    }
 }
public class A_Controller : ApiController
{
  [ActionName("Default")]
  [CustomAuthorize()]
  public string get()
  {
    return "Requested Data";
  }
}
自定义授权

public CustomAuthorizeAttribute : AuthorizeAttribute
{
  protected override bool AuthorizeCore(HttpContextBase httpContext)
  {
    // do OAuth checking
    if (HttpContext.Current.Request.Path 
    or HttpContext.Current.Request.QueryString["OAuthToken"].Equals())
    {
      return true;
    }

    return base.AuthorizeCore(httpContext);
  }
}
现在,您的控制器只执行以下操作。您有一种可重用的方式来授权所有请求


/api/oauth/{Controller}
不等于maproute
api/oauth/token/{token_num}/{Controller}
?是的,但这不是重点。。。很抱歉要编辑now@ErikPhilips这是复制粘贴问题:)你的问题真是模棱两可。您需要设计、路由、安全性方面的帮助吗?@ErikPhilips路由设计,您知道,我希望能够在没有Oauth的情况下调用我的控制器,并且在Oauth进入URL时调用Oauth非常感谢,我明天会看一看并试一试。虽然看起来有点混乱。如果你愿意,我们当然可以聊一聊。你说的“假设用户已经授权”是什么意思?在“./{controller}/”之前使用“./oauth/”的目的是决定要使用哪种类型的身份验证。我假设如果oauth在url中,那么他们有一个oauth令牌(他们已经过身份验证)。我写的是如何授权(用户也有权访问)。所有这些都与身份验证(用户是谁)无关。
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
  filters.Add(new CustomAuthorizeAttribute());
}