我有一個自定義授權屬性類來檢查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