У меня есть собственный класс атрибутов авторизации, чтобы дважды проверять 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;
}
}
Я написал код, и он работает. Но я хочу знать, является ли это правильным способом авторизации пользователей?