Nik*_*hil 5 basic-authentication asp.net-mvc-3
我有一个使用基本身份验证的ASP MVC3 restful服务.搜索堆栈溢出后,我创建了以下代码.
public class BasicAuthentication : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var req = filterContext.HttpContext.Request;
if (String.IsNullOrEmpty(req.Headers["Authorization"]))
{
filterContext.Result = new HttpNotFoundResult();
}
else
{
var credentials = System.Text.ASCIIEncoding.ASCII
.GetString(Convert.FromBase64String(req.Headers["Authorization"].Substring(6)))
.Split(':');
var user = new { Name = credentials[0], Password = credentials[1] };
if(!(user.Name == "username" && user.Password == "passwords"))
{
filterContext.Result = new HttpNotFoundResult();
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
1)ActionFilterAttribute是最好的方法吗?
2)设置filterContext.Result是否正确拒绝访问控制器方法?
3)有什么我做错了吗?
谢谢.
-缺口
Adr*_*man 12
1)这是ActionFilterAttribute最好的方法吗?
我认同.此方法反映了内置Authorize属性的实现.
2)是否设置filterContext.Result了拒绝访问控制器方法的正确方法?
是.多数民众赞成在那里.(1)
3)有什么我做错了吗?
HttpUnauthorizedResult()发送http 401错误而不是http 404错误HttpNotFoundResult().下面是我的代码实现(我肯定也有它的问题).
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
if (String.IsNullOrEmpty(filterContext.HttpContext.Request.Headers["Authorization"]))
{
filterContext.Result = new HttpUnauthorizedResult();
}
else
{
if (filterContext.HttpContext.Request.Headers["Authorization"].StartsWith("Basic ", StringComparison.InvariantCultureIgnoreCase))
{
string[] credentials = ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(filterContext.HttpContext.Request.Headers["Authorization"].Substring(6))).Split(':');
if (credentials.Length == 2)
{
if (String.IsNullOrEmpty(credentials[0]))
{
filterContext.Result = new HttpUnauthorizedResult();
}
else if (!(credentials[0] == "username" && credentials[1] == "passwords"))
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
else
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
else
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
base.OnActionExecuting(filterContext);
}
catch
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
Run Code Online (Sandbox Code Playgroud)
笔记
参考
(1)http://msdn.microsoft.com/en-us/magazine/gg232768.aspx
小智 8
Adrian的重构版本
public class BasicAuthenticationAttribute : ActionFilterAttribute
{
private static readonly string AuthorizationHeader = "Authorization";
private static readonly string BasicHeader = "Basic ";
private static readonly string Username = "username";
private static readonly string Password = "password";
private static readonly char[] Separator = ":".ToCharArray();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
try
{
if (!Authenticated(filterContext.HttpContext.Request))
filterContext.Result = new HttpUnauthorizedResult();
base.OnActionExecuting(filterContext);
}
catch
{
filterContext.Result = new HttpUnauthorizedResult();
}
}
private bool Authenticated(HttpRequestBase httpRequestBase)
{
bool authenticated = false;
if (String.IsNullOrEmpty(httpRequestBase.Headers[AuthorizationHeader]) == false &&
httpRequestBase.Headers[AuthorizationHeader].StartsWith(BasicHeader, StringComparison.InvariantCultureIgnoreCase))
{
string[] credentials = Encoding.ASCII.GetString(Convert.FromBase64String(
httpRequestBase.Headers[AuthorizationHeader].Substring(BasicHeader.Length))).Split(Separator);
if (credentials.Length == 2 && credentials[0] == Username && credentials[1] == Password)
{
authenticated = true;
}
}
return authenticated;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9067 次 |
| 最近记录: |