我有一个自定义授权属性类来检查isAuthorize
两次。如何使用自定义授权属性多次授权用户?
我想要什么:
1)它首先会检查用户是否是super admin
与否。如果他是,那么他将是authorized
。
2)如果he is not
,那么它将检查他是否具有名为“Deal User
”的角色。如果he is not
那么他将是unauthorized
。
3)现在如果用户is in
为“Deal User
”角色,我想检查用户是否拥有该交易。因此,如果用户拥有该交易,我会检查数据库。如果he owns
,那么他将是authorized
。否则他将是Unauthorized
。
public class DealManageCustomAuthorizeAttribute : AuthorizeAttribute
{
private static ApplicationDbContext Context = new ApplicationDbContext();
private static UserStore<ApplicationUser> userStore = new UserStore<ApplicationUser>(Context);
private UserManager<ApplicationUser> userManager = new UserManager<ApplicationUser>(userStore);
private enum Result
{
Authorize,
Unauthorize,
InternalServerError
}
public override void OnAuthorization(HttpActionContext actionContext)
{
var result = AuthorizeRequest(actionContext);
if (result == Result.Authorize)
{
return;
}
else
{
HandleUnauthorizedRequest(actionContext);
}
}
protected override void HandleUnauthorizedRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
//Code to handle unauthorized request
base.HandleUnauthorizedRequest(actionContext);
}
private Result AuthorizeRequest(System.Web.Http.Controllers.HttpActionContext actionContext)
{
base.Roles = "Super Admin";
bool authorized = base.IsAuthorized(actionContext);
if (!authorized)
{
try
{
base.Roles = "Deal User";
bool auth = base.IsAuthorized(actionContext);
if (!auth)
{
return Result.Unauthorize;
}
Uri uri = actionContext.Request.RequestUri;
Guid dealId = new Guid(HttpUtility.ParseQueryString(uri.Query).Get("dealId"));
string userId = HttpContext.Current.User.Identity.GetUserId();
var retval = new Deal(Common.Common.TableSureConnectionString).CheckDealByIdAndUserId(dealId, userId);
if (retval)
{
return Result.Authorize;
}
return Result.Unauthorize;
}
catch (Exception)
{
return Result.InternalServerError;
}
}
return Result.Authorize;
}
}
我写的代码,它工作正常。但是我想知道是否是 正确授权用户的方式?
哦。你节省了我的时间......正常工作。一个问题。我不明白使用属性的用法。 –
请参阅[MSDN文档](https://msdn.microsoft.com/en-us/library/system.attributeusageattribute(v = vs.110).aspx)。 AttributeUsage只是告诉编译器该属性在方法(动作)或类(控制器)上是有效的。在后一种情况下,您可以*授权具有一个属性的整个控制器。例如,如果您尝试将其放置在属性或程序集上,则无效 - 您将收到编译器错误。由于它也是[过滤器](https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx),因此它也可以在应用程序范围内注册。 – NightOwl888