public class MyAuthorizeAttribute: AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authorized = base.AuthorizeCore(httpContext);
if (!authorized)
{
// The user is not authorized => no need to go any further
return false;
}
// We have an authenticated user, let's get his username
string authenticatedUser = httpContext.User.Identity.Name;
// and check if he has completed his profile
if (!this.IsProfileCompleted(authenticatedUser))
{
// we store some key into the current HttpContext so that
// the HandleUnauthorizedRequest method would know whether it
// should redirect to the Login or CompleteProfile page
httpContext.Items["redirectToCompleteProfile"] = true;
return false;
}
return true;
}
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Items.Contains("redirectToCompleteProfile"))
{
var routeValues = new RouteValueDictionary(new
{
controller = "someController",
action = "someAction",
});
filterContext.Result = new RedirectToRouteResult(routeValues);
}
else
{
base.HandleUnauthorizedRequest(filterContext);
}
}
private bool IsProfileCompleted(string user)
{
// You know what to do here => go hit your database to verify if the
// current user has already completed his profile by checking
// the corresponding field
throw new NotImplementedException();
}
}
、その後、あなたはこのカスタム属性を使用して、コントローラのアクションを飾ることができます:
[MyAuthorize]
public ActionResult FooBar()
{
...
}
私のmvcアプリケーションでカスタム権限を与えるためにこの例を使用しています。しかし、URLを返すようにリダイレクトしません。私は何かを忘れましたか? – Ranger
もう一度私はここにいる、上の問題は解決されました。私はセッションベースのログインを使用していて、承認後に実行する必要のあるコードを実行することがあります。私はセッションキーの静的プロパティを使用しています。これで私を助けることができますか? 保護オーバーライドブールAuthorizeCore(HttpContextBaseのHttpContext) {IF(string.IsNullOrEmpty(CurrentUser.UserName)|| CurrentUser.UserName == "「)falseを返す 。 がtrueを返します。 } – Ranger
この回答はMVC 5と互換性がありますか、または変更する必要がありますか? – radbyx