Skip to content

Instantly share code, notes, and snippets.

@feanz
Created January 25, 2012 11:08
Show Gist options
  • Save feanz/1675844 to your computer and use it in GitHub Desktop.
Save feanz/1675844 to your computer and use it in GitHub Desktop.
A custom authorize attribute
using System;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace StarterSite.Web.Helpers
{
/// <summary>
/// Override the standard AuthorizeAttribute with a Custom implmentation that uses are custom Identity and
/// Principal to authenticate users actions
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]
public sealed class CustomAuthorizeAttribute : AuthorizeAttribute
{
/// <summary>
/// Uses Custom Identity and Principal to check that user is validated for this system and if the user is in the role
/// specified on the auth attribute.
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
var authorised = false;
if (httpContext.User.Identity.IsAuthenticated)
{
if (httpContext.User.IsInRole(Roles))
{
authorised = true;
}
}
return authorised;
}
/// <summary>
/// Cverride the standard Authorize attribute. Checks that user is authenticated and has valide permissions
/// </summary>
/// <param name="filterContext"></param>
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (AuthorizeCore(filterContext.HttpContext))
{
SetCachePolicy(filterContext);
}
else if (ActionAllowAnonymousAccess(filterContext))
{
SetCachePolicy(filterContext);
}
else if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// auth failed, redirect to no access page
filterContext.Result =
new RedirectToRouteResult(
(new RouteValueDictionary { { "controller", "Error" }, { "action", "NoAccess" } }));
}
else if (filterContext.HttpContext.User.IsInRole("Admin"))
{
// is authenticated and is in the Admin role
SetCachePolicy(filterContext);
}
else
{
// auth failed, redirect to Insufficient Permissions
filterContext.Result = new RedirectToRouteResult((new RouteValueDictionary { { "controller", "Error" }, { "action", "InsufficientPermissions" } }));
}
}
private bool ActionAllowAnonymousAccess(AuthorizationContext filterContext)
{
return (filterContext.ActionDescriptor.GetCustomAttributes(typeof(AllowAnonymousAttribute), true).FirstOrDefault() as AllowAnonymousAttribute) != null
}
/// <summary>
/// ** IMPORTANT **
/// Since we're performing authorization at the action level, the authorization code runs
/// after the output caching module. In the worst case this could allow an authorized user
/// to cause the page to be cached, then an unauthorized user would later be served the
/// cached page. We work around this by telling proxies not to cache the sensitive page,
/// then we hook our custom authorization code into the caching mechanism so that we have
/// the final say on whether a page should be served from the cache.
/// </summary>
/// <param name="filterContext"></param>
private void SetCachePolicy(AuthorizationContext filterContext)
{
var cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
{
validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
}
}
}
@LeeZenGithub
Copy link

how to create custom game?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment