gpt4 book ai didi

c# - 如何将授权逻辑与 Controller 操作分开?

转载 作者:行者123 更新时间:2023-11-30 22:18:51 25 4
gpt4 key购买 nike

给定以下代码:

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

中检查该 header 值

例如;

在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com