C#WEB(RESTful)API 4.5路由Oauth2.0的正确/最智能的方式
我正在使用asp.NETWebAPI开发一个RESTfulWebAPI。当我开始实现Oauth2.0服务时,我发现了一个小的路由问题 例如: 我有3个控制器: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
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}
不等于maprouteapi/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());
}