gpt4 book ai didi

c# - 对 asp.net mvc 中的身份验证非常困惑

转载 作者:行者123 更新时间:2023-11-30 17:24:02 24 4
gpt4 key购买 nike

我得出的结论是我需要放弃 ASP.NET Membership(原因列表)。

现在我真正看到的唯一需要做的就是创建一个 cookie(通过 Form Authentication 完成),自定义身份验证方法(完成),最后根据他们是否登录或通过作用。

我卡在最后一个了。

我正在尝试覆盖 Authorize(属性),但我不知道该怎么做。我看了很多例子,每个例子的做法似乎都与下一个不同。我不知道他们为什么这样做或我应该使用哪一个。

一些教程似乎在AuthorizeCore 中进行身份验证,有些在OnAuthentication 中进行。

一些使用一些 AuthorizationContext 东西然后调用这个基类。

base.OnAuthorization(filterContext);

有些好像在里面做了缓存。

我想要的是内置功能的所有功能,但只是连接到我的自定义表格。就像我要有自己的角色表一样。我需要告诉它那在哪里,然后把东西拉进去。

我也不知道如何做到这一点或如何像这样装饰标签

[Authorize(Roles="test")]

引用资料:- http://darioquintana.com.ar/blogging/tag/aspnet-mvc/ asp.net mvc Adding to the AUTHORIZE attribute http://davidhayden.com/blog/dave/archive/2009/04/09/CustomAuthorizationASPNETMVCFrameworkAuthorizeAttribute.aspx

编辑

这就是我现在拥有的。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class AuthorizeAttributeCustom : AuthorizeAttribute
{

public string Roles { get; set; }


private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
{
validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
}

public override void OnAuthorization(AuthorizationContext filterContext)
{

if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}

if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// auth failed, redirect to login page
filterContext.Result = new HttpUnauthorizedResult();
return;
}

DataClasses1DataContext test = new DataClasses1DataContext();
var name = filterContext.HttpContext.User.Identity.Name;
var user = test.User2s.Where(u => u.userName == name).FirstOrDefault();
var role = test.Roles.Where(u => u.UserId == user.userId).Select(u => u.Role1).FirstOrDefault();

string[] split = Roles.Split(',');

if (split.Contains(role) == true)
{
// is authenticated and is in the required role
SetCachePolicy(filterContext);
return;
}
filterContext.Result = new HttpUnauthorizedResult();
}

private void SetCachePolicy(AuthorizationContext filterContext)
{
// ** 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.
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}
}

悬而未决的问题

  1. 为什么要密封?如果是密封的这不会让团结变得更难吗测试?
  2. 什么是 filterContext?
  3. 为什么没有使用 AuthorizeCore?仅有的OnAuthentication?
  4. 缓存指的是什么?喜欢它在缓存角色吗?还是页面?我无法用调试器告诉它似乎每一个都运行代码时间。

  5. 缓存安全吗?

  6. 一般来说这样安全吗(即没有漏洞在其中被剥削-有点担心我会把事情搞砸然后有我网站上的一些大漏洞)。

最佳答案

这里有一个自定义属性,可以按您的需要工作;对角色类型使用 Enum 并自己使用 cookie 创建,这允许存储角色。

用法

  [AuthorizeAttributeCustom(RoleRequired = GoodRoles.YourRoleTypeHere)]

属性代码:

//http://stackoverflow.com/questions/977071/redirecting-unauthorized-controller-in-asp-net-mvc/977112#977112
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public sealed class AuthorizeAttributeCustom : AuthorizeAttribute
{

/// <summary>
/// The name of the view to render on authorization failure. Default is "Error".
/// </summary>
public string ViewName { get; set; }
public ViewDataDictionary ViewDataDictionary { get; set; }
public DeniedAccessView DeniedAccessView { get; set; }

private GoodRoles roleRequired = GoodRoles.None;
public GoodRoles RoleRequired { get{ return roleRequired;} set{ roleRequired = value;} } // this may evolve into sets and intersections with an array but KISS

public AuthorizeAttributeCustom()
{
ViewName = "DeniedAccess";
DeniedAccessView = new DeniedAccessView
{
FriendlyName = "n/a",
Message = "You do not have sufficient privileges for this operation."
};
ViewDataDictionary = new ViewDataDictionary(DeniedAccessView);
}

private void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
{
validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
}


public override void OnAuthorization(AuthorizationContext filterContext)
{

if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}

if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// auth failed, redirect to login page
filterContext.Result = new HttpUnauthorizedResult();
return;
}

if (RoleRequired == GoodRoles.None || filterContext.HttpContext.User.IsInRole(RoleRequired.ToString()))
{
// is authenticated and is in the required role
SetCachePolicy(filterContext);
return;
}

filterContext.Result = new ViewResult { ViewName = ViewName, ViewData = ViewDataDictionary };
}

private void SetCachePolicy(AuthorizationContext filterContext)
{
// ** 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.
HttpCachePolicyBase cachePolicy = filterContext.HttpContext.Response.Cache;
cachePolicy.SetProxyMaxAge(new TimeSpan(0));
cachePolicy.AddValidationCallback(CacheValidateHandler, null /* data */);
}


}

您需要明确地将您的角色添加到 auth cookie 中,并在基本 Controller 中读取它们。我的实现还有其他你可能不想要的细节,所以最好在这里阅读:http://ondotnet.com/pub/a/dotnet/2004/02/02/effectiveformsauth.html

关于c# - 对 asp.net mvc 中的身份验证非常困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1485640/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com