如何修改 Web API 的 "Global.asax" 以影响帮助页面? (MVC)
How to modify the "Global.asax" of a Web API just to impact the Help Page? (MVC)
* 场景:*
我有一个用 C# Visual Studio 2012 制作的 Web api 服务应用程序。
此 Web 服务有一个 "Areas" 文件夹,其中包含 Web Api 帮助页面的默认项目。
* 问题:*
根据要求,我必须实施手动输入来验证和授权可以阅读 Web Api 帮助页面的用户。但不在网络服务中。
到目前为止一切顺利,我已经制作了一个帐户控制器、登录程序、从数据库中获取角色等。
但是现在,我试图实现的是如何在global.asax中编写Application_PostAuthenticateRequest过程,因为唯一global.asax我的是主项目,Web API帮助页面没有他自己的。
* 问题 *
如何在不影响主服务的情况下编写 Application_PostAuthenticateRequest 方法,以便使用授权属性 Web API 帮助页面中仅?
谢谢和亲切的问候,
如果我理解你的问题,你想路由到仅具有授权的特定路径?
如果是这种情况,您可以将路由用作 Web 的一部分API 2
在WebAPIConfig.cs
内添加如下配置
public static void Register(HttpConfiguration config)
{
//Enable attribute routing
config.MapHttpAttributeRoutes();
//... additional configuraitons
}
然后在您的 API 控制器中,您可以设置独立于默认值的路由并添加您需要的任何属性:
[Route("apiname/authroizedLogin")]
[Authorize(Roles="admin")]
public void IHttpActionResult(string username, stringpassword)
{
try
{
dosomething...
return Ok(somecontext);
}
catch(exception e)
{
return BadResponse(e.message);
}
}
Here is a link with more information on routes in WebAPI 2
编辑
关于访问角色。这取决于您的实施。我个人不喜欢使用 global.asx,因为它会更频繁地发出数据库请求。我需要有关您的实施的更多信息才能提出任何真正的建议。但是这里有几个选项。如果您使用 claims based authentication,角色可以是声明的一部分,并将作为 http context/request 的一部分传递给 API。从这里您可以得出以下身份:
public long RoleId
{
get
{
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
string id = identity.Claims.Where(c => c.Type == "http://myschema.com/app/claims/roleid")
.Select(c => c.Value).SingleOrDefault();
//return 0 if no claim is located
return (!String.IsNullOrEmpty(id)) ? Convert.ToInt32(id) : 0;
}
set
{
_userId = value;
}
}
如果您不使用声明,另一种选择是生成一个 FormsAuthenticaitonTicket,一旦用户通过身份验证,它就可以被加密并存储为 cookie。
* 场景:*
我有一个用 C# Visual Studio 2012 制作的 Web api 服务应用程序。 此 Web 服务有一个 "Areas" 文件夹,其中包含 Web Api 帮助页面的默认项目。
* 问题:*
根据要求,我必须实施手动输入来验证和授权可以阅读 Web Api 帮助页面的用户。但不在网络服务中。
到目前为止一切顺利,我已经制作了一个帐户控制器、登录程序、从数据库中获取角色等。
但是现在,我试图实现的是如何在global.asax中编写Application_PostAuthenticateRequest过程,因为唯一global.asax我的是主项目,Web API帮助页面没有他自己的。
* 问题 *
如何在不影响主服务的情况下编写 Application_PostAuthenticateRequest 方法,以便使用授权属性 Web API 帮助页面中仅?
谢谢和亲切的问候,
如果我理解你的问题,你想路由到仅具有授权的特定路径?
如果是这种情况,您可以将路由用作 Web 的一部分API 2
在WebAPIConfig.cs
内添加如下配置
public static void Register(HttpConfiguration config)
{
//Enable attribute routing
config.MapHttpAttributeRoutes();
//... additional configuraitons
}
然后在您的 API 控制器中,您可以设置独立于默认值的路由并添加您需要的任何属性:
[Route("apiname/authroizedLogin")]
[Authorize(Roles="admin")]
public void IHttpActionResult(string username, stringpassword)
{
try
{
dosomething...
return Ok(somecontext);
}
catch(exception e)
{
return BadResponse(e.message);
}
}
Here is a link with more information on routes in WebAPI 2
编辑
关于访问角色。这取决于您的实施。我个人不喜欢使用 global.asx,因为它会更频繁地发出数据库请求。我需要有关您的实施的更多信息才能提出任何真正的建议。但是这里有几个选项。如果您使用 claims based authentication,角色可以是声明的一部分,并将作为 http context/request 的一部分传递给 API。从这里您可以得出以下身份:
public long RoleId
{
get
{
var identity = (ClaimsPrincipal)Thread.CurrentPrincipal;
string id = identity.Claims.Where(c => c.Type == "http://myschema.com/app/claims/roleid")
.Select(c => c.Value).SingleOrDefault();
//return 0 if no claim is located
return (!String.IsNullOrEmpty(id)) ? Convert.ToInt32(id) : 0;
}
set
{
_userId = value;
}
}
如果您不使用声明,另一种选择是生成一个 FormsAuthenticaitonTicket,一旦用户通过身份验证,它就可以被加密并存储为 cookie。