![](/img/trans.png)
[英]c# WebApi how to unit test if a controller action is decorated with an authorization attribute with specific arguments
[英]c# WebApi Attribute Authorization
我有一個由外部程序員編寫的代碼。 該項目是WebApi。 我不知道授權是如何發生的。 我認為,控制器方法上方的屬性可以實現此目的。 但是我不明白授權是如何發生的。 控制器方法示例:
[HttpGet]
[Route("organizationunits/{entity}/{type}")]
[MDLAuthorize(Actions.Read)]
public async Task<IHttpActionResult> GetEntities(string entity, string type)
{//some code}
MDLAuthorize屬性指定一種方法。 而且我認為以某種方式調用了IsAuthorized方法。
public class MDLAuthorize : AuthorizeAttribute
{
private string _action;
public MDLAuthorize(string action)
: base()
{
_action = action;
}
protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
{
try
{
if (String.IsNullOrEmpty(_action))
return false;
var baseAuthorized = base.IsAuthorized(actionContext);
string activity = actionContext.ActionDescriptor.ControllerDescriptor.ControllerName;
if (actionContext.RequestContext.Principal == null ||
actionContext.RequestContext.Principal.Identity == null)
{
//no principal, no fun.
return false;
}
else
{
string username = actionContext.RequestContext.Principal.Identity.Name;
bool isAuthorized = Security.HasPermission(username, activity, _action);
return isAuthorized;
}
}
catch (Exception ex)
{
MDLApiLog.Error(ex);
return false;
}
}
}
我不知道我的問題是否需要,但這是AuthorizeAttribute類
//
// Summary:
// Specifies the authorization filter that verifies the request's System.Security.Principal.IPrincipal.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
public class AuthorizeAttribute : AuthorizationFilterAttribute
{
//
// Summary:
// Initializes a new instance of the System.Web.Http.AuthorizeAttribute class.
public AuthorizeAttribute();
//
// Summary:
// Gets or sets the authorized roles.
//
// Returns:
// The roles string.
public string Roles { get; set; }
//
// Summary:
// Gets a unique identifier for this attribute.
//
// Returns:
// A unique identifier for this attribute.
public override object TypeId { get; }
//
// Summary:
// Gets or sets the authorized users.
//
// Returns:
// The users string.
public string Users { get; set; }
//
// Summary:
// Calls when an action is being authorized.
//
// Parameters:
// actionContext:
// The context.
//
// Exceptions:
// T:System.ArgumentNullException:
// The context parameter is null.
public override void OnAuthorization(HttpActionContext actionContext);
//
// Summary:
// Processes requests that fail authorization.
//
// Parameters:
// actionContext:
// The context.
protected virtual void HandleUnauthorizedRequest(HttpActionContext actionContext);
//
// Summary:
// Indicates whether the specified control is authorized.
//
// Parameters:
// actionContext:
// The context.
//
// Returns:
// true if the control is authorized; otherwise, false.
protected virtual bool IsAuthorized(HttpActionContext actionContext);
}
繼承AuthorizeAttribute
任何屬性都將在請求時調用其IsAuthorized()
方法。 派生屬性中該方法的主體使用Security.HasPermission()
方法檢查用戶是否能夠執行該操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.