C# AuthorizationAsync函数的自定义AuthorizationAttribute
我正在尝试创建自己的自定义C# AuthorizationAsync函数的自定义AuthorizationAttribute,c#,asp.net,asp.net-web-api,async-await,C#,Asp.net,Asp.net Web Api,Async Await,我正在尝试创建自己的自定义System.Web.Http.AuthorizeAttribute。在我需要在重写的OnAuthorization函数中运行一些async函数之前,一切都正常 我找到了OnAuthorizationAsync方法,并使用了该方法,但是在运行async方法时仍然存在问题。我需要确保附加到HttpActionContext的头在数据库中 public override Task OnAuthorizationAsync(HttpActionContext acti
System.Web.Http.AuthorizeAttribute
。在我需要在重写的OnAuthorization
函数中运行一些async
函数之前,一切都正常
我找到了OnAuthorizationAsync
方法,并使用了该方法,但是在运行async
方法时仍然存在问题。我需要确保附加到HttpActionContext
的头在数据库中
public override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
IEnumerable<string> values;
if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
{
var token = new Token() { TokenString = values.First() };
if (await _tg.ValidateToken(token))
{
return base.OnAuthorizationAsync(actionContext, cancellationToken);
}
}
base.HandleUnauthorizedRequest(actionContext);
}
AuthorizationAsync(HttpActionContext actionContext,CancellationToken CancellationToken)上的公共重写任务
{
i可数值;
if(actionContext.Request.Headers.TryGetValues(“身份验证”,输出值))
{
var token=new token(){TokenString=values.First()};
如果(等待_tg.ValidateToken(令牌))
{
返回base.OnAuthorizationAsync(actionContext,cancellationToken);
}
}
base.HandleUnauthorizedRequest(actionContext);
}
\u tg.ValidateToken(token)
是一种返回bool的异步方法。如果我尝试等待它,并将OnAuthorizationAsync
作为异步
方法,那么我显然无法返回任务:
由于OnAuthorizeAsync是一个返回“Task”的async
方法,因此返回关键字后面不能跟有对象表达式
有没有办法摆脱这种混乱局面?因为使用了wait
,所以需要在方法声明中添加async
修饰符。然后将返回
更改为等待
。编译器将完成剩下的工作,即为您返回任务。因为您使用wait
,所以需要在方法声明中添加async
修饰符。然后将返回
更改为等待
。编译器将完成剩下的工作,即为您返回任务。基于@sellotape的答案:
public async override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
IEnumerable<string> values;
if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
{
var token = new Token() { TokenString = values.First() };
if (await _tg.ValidateToken(token))
{
return base.OnAuthorizationAsync(actionContext, cancellationToken);
}
}
await base.HandleUnauthorizedRequest(actionContext);
}
AuthorizationAsync上的公共异步重写任务(HttpActionContext actionContext,CancellationToken CancellationToken)
{
i可数值;
if(actionContext.Request.Headers.TryGetValues(“身份验证”,输出值))
{
var token=new token(){TokenString=values.First()};
如果(等待_tg.ValidateToken(令牌))
{
返回base.OnAuthorizationAsync(actionContext,cancellationToken);
}
}
wait base.HandleUnauthorizedRequest(actionContext);
}
基于@sellotape的回答:
public async override Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
IEnumerable<string> values;
if (actionContext.Request.Headers.TryGetValues("Authentication", out values))
{
var token = new Token() { TokenString = values.First() };
if (await _tg.ValidateToken(token))
{
return base.OnAuthorizationAsync(actionContext, cancellationToken);
}
}
await base.HandleUnauthorizedRequest(actionContext);
}
AuthorizationAsync上的公共异步重写任务(HttpActionContext actionContext,CancellationToken CancellationToken)
{
i可数值;
if(actionContext.Request.Headers.TryGetValues(“身份验证”,输出值))
{
var token=new token(){TokenString=values.First()};
如果(等待_tg.ValidateToken(令牌))
{
返回base.OnAuthorizationAsync(actionContext,cancellationToken);
}
}
wait base.HandleUnauthorizedRequest(actionContext);
}
@Nick H,如果该答案适用于you@Nick如果这个答案对你有效,你应该把它标记为有效