Web API自定义身份验证筛选器
本文关键字:筛选 身份验证 自定义 API Web | 更新日期: 2023-09-27 18:01:04
我正试图为我的web api控制器制作一个自定义过滤器,作为ASP.NET MVC 5网站/应用程序的一部分,以检查我存储在数据库中的特定令牌的请求标头。我发现的大多数示例都包含用户凭据,然后使用身份验证用户。不完全是我想要的。
这是我找到的教程,目前正在学习。
web API应仅处理"外部"HTTP调用,网站方目前将拥有自己的控制器(但可能会更改(。
如果可能的话,这个过滤器应该与已经存在的标识2系统接口。
我所做的是发送用户凭据,然后为用户分配一个令牌,然后我想使用该令牌来验证请求。有没有一种方法可以根据令牌过滤请求,或者我需要使用Owin身份和他们的令牌管理。我正在使用一个移动客户端(目前是iOS,也将包括android(来打电话。有什么我可以参考的例子或教程吗?
该令牌目前是字母数字字符和符号的随机组合。
谢谢。
附言:我可以在需要的地方发布代码片段和其他东西。
编辑:HTTPRequest将根据它们是否包含我们数据库/系统中存在的令牌进行筛选。包含令牌或不存在于我们系统中的请求将收到未经授权的错误(401?(
假设您认为向每个请求发送用户名和密码是不好的。请参阅我下面没有用户名和密码的实现,因为我们不会在每个请求中都发送用户名和密码。
public class AuthenticationFilter : AuthorizationFilterAttribute
{
/// <summary>
/// read requested header and validated
/// </summary>
/// <param name="actionContext"></param>
public override void OnAuthorization(HttpActionContext actionContext)
{
var identity = FetchFromHeader(actionContext);
if(identity != null)
{
var securityService = actionContext.ControllerContext.Configuration.DependencyResolver.GetService(typeof(ILoginService)) as ILoginService;
if (securityService.TokenAuthentication(identity))
{
CurrentThread.SetPrincipal(new GenericPrincipal(new GenericIdentity(identity), null), null, null);
}
else
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
return;
}
}
else
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
return;
}
base.OnAuthorization(actionContext);
}
/// <summary>
/// retrive header detail from the request
/// </summary>
/// <param name="actionContext"></param>
/// <returns></returns>
private string FetchFromHeader(HttpActionContext actionContext)
{
string requestToken = null;
var authRequest = actionContext.Request.Headers.Authorization;
if (authRequest != null && !string.IsNullOrEmpty(authRequest.Scheme) && authRequest.Scheme == "Basic")
requestToken = authRequest.Parameter;
return requestToken;
}
}
您可以通过属性注入服务依赖项(属性注入(来使这个过滤器单元可测试。对于自定义属性,我们不希望通过构造函数传递依赖关系。我们希望属性易于使用要重写@Raj已经开始的内容,可以如下所示:
public class AuthenticationFilter : AuthorizationFilterAttribute
{
[Dependency]
public ILoginService LoginService { get; set; }
/// <summary>
/// read requested header and validated
/// </summary>
/// <param name="actionContext"></param>
public override void OnAuthorization(HttpActionContext actionContext)
{
var identity = FetchFromHeader(actionContext);
if (identity != null)
{
if (LoginService.TokenAuthentication(identity))
{
CurrentThread.SetPrincipal(new GenericPrincipal(new GenericIdentity(identity), null), null, null);
//IPrincipal principal = new GenericPrincipal(new GenericIdentity(identity), new string[] { "myRole" });
//Thread.CurrentPrincipal = principal;
//HttpContext.Current.User = principal;
}
else
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized);
return;
}
}
else
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest);
return;
}
base.OnAuthorization(actionContext);
}
/// <summary>
/// retrive header detail from the request
/// </summary>
/// <param name="actionContext"></param>
/// <returns></returns>
private string FetchFromHeader(HttpActionContext actionContext)
{
string requestToken = null;
var authRequest = actionContext.Request.Headers.Authorization;
if (authRequest != null && !string.IsNullOrEmpty(authRequest.Scheme) && authRequest.Scheme == "Basic")
requestToken = authRequest.Parameter;
return requestToken;
}
}