我如何使用ASP.NET Web API开始编码身份验证,因此它是支持桌面,移动和Web的跨平台?我读过一些做RESTful身份验证的方法,比如在标题中使用标记。
是否有任何使用此方法的示例项目?
问题:
[Authorize]
属性以读取令牌? 答案 0 :(得分:42)
我认为令牌将是一条可靠的方式。表单身份验证基于Web的Cookie。不过,对于所有非浏览器客户端来说,这不是最有意义
我建议创建自定义AuthorizationFilterAttribute并覆盖OnAuthorization方法。在该方法中,您可以检查是否存在您在提供有效凭据后发给客户端的令牌。您可以在要验证的任何方法或控制器上使用此属性。以下是您可能会参考的示例
public class AuthorizeTokenAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext != null)
{
if (!AuthorizeRequest(actionContext.ControllerContext.Request))
{
actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized) { RequestMessage = actionContext.ControllerContext.Request };
}
return;
}
}
private bool AuthorizeRequest(System.Net.Http.HttpRequestMessage request)
{
bool authorized = false;
if (request.Headers.Contains(Constants.TOKEN_HEADER))
{
var tokenValue = request.Headers.GetValues("TOKEN_HEADER");
if (tokenValue.Count() == 1) {
var value = tokenValue.FirstOrDefault();
//Token validation logic here
//set authorized variable accordingly
}
}
return authorized;
} }
TOKEN_HEADER只是一个字符串,表示客户端应该为经过身份验证的请求传回的HTTP标头。
让我们一起来看看
另外,请查看John Petersen的这篇文章。 Making your ASP.NET Web API’s secure
答案 1 :(得分:21)
有很多方法可以为REST服务验证用户身份。使用令牌是可能的,但只使用Basic Authentication甚至更简单,并且可以作为标准和跨平台使用。
请勿将authorization与authentication混淆。 [Authorize]属性是关于授权的,但仅在用户使用其他机制进行身份验证之后。如果没有先进行适当的身份验证,授权就完全没用了。
要检查的最佳资源是Dominick Baier谁是该主题的专家。
答案 2 :(得分:2)
我使用一种非常简单的方法:
使用新的ASP.NET MVC Web API的这种方法的服务可以服务于任何类型的客户端:浏览器/ javascript和本机(桌面或移动)等。
答案 3 :(得分:0)
你可以使用ActionFilterAttribute并覆盖OnActionExecuting方法。 稍后在global.cs中注册此过滤器,以将此过滤器应用于Application Start方法
中的所有操作var config = GlobalConfiguration.Configuration; config.Filters.Add(new CustomAuthAttribute());
{ 命名空间Customss { 公共类CustomAuthAttribute:ActionFilterAttribute
{
public override void OnActionExecuting(HttpActionContext actionContext)
{
// To inforce HTTPS if desired , else comment out the code
if (!String.Equals(actionContext.Request.RequestUri.Scheme, "https", StringComparison.OrdinalIgnoreCase))
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest)
{
Content = new StringContent("HTTPS Required")
};
return;
}
// get toekn from the header
var userToken = actionContext.Request.Headers.GetValues("UserToken");
// Customer Logic to check the validity of the token.
// U can have some DB logic to check , custom STS behind or some loca cache used to compare the values
}
}
} }