作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定以下代码:
public class BackupsController : ApiController
{
private readonly IApiContext context;
private readonly IBackupService backupService;
public BackupsController(IApiContext context, IBackupService backupService)
{
this.context = context;
this.backupService = backupService;
}
public HttpResponseMessage Get(Guid id)
{
if (id == Guid.Empty)
{
throw new HttpResponseException(HttpStatusCode.BadRequest);
}
IBackupView backup = backupService.Get(id);
if (backup == null)
{
return Request.CreateErrorResponse(HttpStatusCode.NotFound, String.Format("BackupId '{0}' not found.", id));
}
if (!IsAuthorizedForBackup(backup))
{
throw new HttpResponseException(HttpStatusCode.Forbidden);
}
return Request.CreateResponse(HttpStatusCode.OK, backup);
}
private bool IsAuthorizedForBackup(IBackupView backup)
{
if (context.Principal.IsInRole(MembershipRole.Admin))
{
return true;
}
if (context.Principal.AllowDataSharing && backup.UserId == context.Principal.UserId)
{
return true;
}
if (backup.UserId == context.Principal.UserId && backup.Device.Uuid == context.DeviceUuid)
{
return true;
}
return false;
}
}
将几乎所有方法主体提取到授权过滤器中是否有意义?如果不检索备份两次,我看不出有什么方法可以做到这一点。
您将如何将授权问题与 Controller 操作分开?
最佳答案
为了将安全逻辑与 Controller 逻辑分开,我更喜欢使用 Http Headers 在浏览器和 Controller 之间携带安全 token ,并在自定义 AuthorizeAttribute
例如;
在 JQuery 的 ajax 函数的 beforeSend
函数中设置安全 token (之前从服务器获取,见下文)
beforeSend: function (xhr) {
xhr.setRequestHeader('requestToken', model.requestToken);
}
检查自定义 AuthorizeAttribute
中的 token
public class AuthAttribute : AuthorizeAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
var token = HttpContext.Current.Request.Headers["requestToken"];
// Do the authorization based on token
}
}
使用自定义 [Auth]
属性装饰 Controller ,其操作需要授权,例如:
[Auth]
public class SomeController : ApiController
我们可以使用 Http Headers 再次将新 token 发送回客户端
HttpContext.Current.Response.Headers["requestToken"] = Guid.NewGuid();
在客户端,你可以将它存储在 JQuery 的 ajax 函数的成功函数中,以便在请求中发回
success: function (res, status, xhr) {
model.requestToken = xhr.getResponseHeader('requestToken');
}
这可能无法完美地处理您的情况,但主要思想是在 Http header 中携带(最好是加密的)安全数据并在自定义 AuthorizeAttribute
中处理安全问题
关于c# - 如何将授权逻辑与 Controller 操作分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15893714/
我是一名优秀的程序员,十分优秀!