- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
是否有人已经在线创建了任何自定义的 asp.net 成员资格提供程序。我想使用自定义提供程序,因为他们的角色提供程序非常缓慢,我想使用整数而不是用户 ID 的 guid
最佳答案
鉴于标准成员提供程序 API 是基于非通用接口(interface)的,因此没有替代实现。
但是,在实践中,整个成员(member) API 增加的值(value)很少,而且推出您自己的解决方案相当容易。
为了帮助您入门,这里提供了一些我通常使用的帮助器类。
首先是一些处理cookies和Forms认证的代码:
public interface ISecurityPersistenceProvider
{
void SetAuthCookie( int version, string name, DateTime expireDate, bool persistent, string cookieData );
HttpCookie GetAuthCookie();
string GetAuthCookieValue( out string name );
void RemoveAuthCookie();
}
public class FormsPersistenceProvider : ISecurityPersistenceProvider
{
public void SetAuthCookie( int version, string name, DateTime expireDate, bool persistent, string cookieData )
{
var ticket = new FormsAuthenticationTicket( version, name, DateTime.Now, expireDate, persistent, cookieData );
string secureTicket = FormsAuthentication.Encrypt( ticket );
var cookie = new HttpCookie( FormsAuthentication.FormsCookieName, secureTicket );
cookie.Expires = ticket.Expiration;
HttpContext.Current.Response.Cookies.Add( cookie );
}
public HttpCookie GetAuthCookie()
{
HttpCookie cookie = HttpContext.Current.Request.Cookies[ FormsAuthentication.FormsCookieName ];
return cookie;
}
public string GetAuthCookieValue( out string name )
{
HttpCookie cookie = GetAuthCookie();
FormsAuthenticationTicket ticket = FormsAuthentication.Decrypt( cookie.Value );
name = ticket.Name;
return ticket.UserData;
}
public void RemoveAuthCookie()
{
FormsAuthentication.SignOut();
}
}
其次,一些根据数据存储验证用户的代码。您需要为此接口(interface)提供您自己的实现(和/或使其适应您的需要)。
public interface ISecurityUserProvider<T> where T : class
{
T AuthenticateUser( string customer, string userName, string passwordHash );
T GetUser( string customer, string userName );
string[] GetRoles( T user );
}
第三,一个让我们向调用者返回额外信息的类(这将被下面的 SecurityManager 类使用):
public class AuthenticationResult
{
#region Fields/Properties
public bool Success { get; internal set; }
public string Message { get; internal set; }
public IDictionary<string,string> Errors { get; internal set; }
#endregion
#region Constructors
public AuthenticationResult( bool success, string message ) : this( success, message, null )
{
}
public AuthenticationResult( bool success, string message, IDictionary<string, string> errors )
{
Success = success;
Message = message;
Errors = errors ?? new Dictionary<string, string>();
}
#endregion
}
我还使用了自定义主体类,它允许我将自定义对象与基本 IPrincipal 实现相关联。这只是为您提供思路的快速摘录:
public class CodeworksPrincipal<TUserData> : IPrincipal where TUserData : class
{
private string name;
private string[] roles;
private string allRoles;
private TUserData userData;
public CodeworksPrincipal( string name, string[] roles, TUserData userData )
{
// init fields, etc.
}
}
最后,具有大部分逻辑的 SecurityManager 类:
public class SecurityManager<T,TPersistenceProvider,TUserProvider>
where T : class
where TPersistenceProvider : ISecurityPersistenceProvider
where TUserProvider : ISecurityUserProvider<T>
{
private readonly ISecurityPersistenceProvider persistenceProvider;
private readonly ISecurityUserProvider<T> userProvider;
// NOTE this constant is used to validate the validity of the cookie (see below)
private const int CookieParameterCount = 3;
public SecurityManager( ISecurityPersistenceProvider persistenceProvider, ISecurityUserProvider<T> userProvider )
{
this.persistenceProvider = persistenceProvider;
this.userProvider = userProvider;
}
#region Properties
protected ISecurityPersistenceProvider PersistenceProvider
{
get { return persistenceProvider; }
}
protected ISecurityUserProvider<T> UserProvider
{
get { return userProvider; }
}
public IIdentity CurrentIdentity
{
get { return Thread.CurrentPrincipal.Identity; }
}
public bool IsAuthenticated
{
get
{
IPrincipal principal = Thread.CurrentPrincipal;
return principal != null && principal.Identity != null && principal.Identity.IsAuthenticated;
}
}
public bool IsInRole( string roleName )
{
IPrincipal principal = Thread.CurrentPrincipal;
return IsAuthenticated && principal.IsInRole( roleName );
}
public string UserName
{
get { return IsAuthenticated ? CurrentIdentity.Name : ""; }
}
#endregion
#region Authentication
public AuthenticationResult Authenticate( string userName, string password, bool persistent, string visitorAddress )
{
return Authenticate( null, userName, password, persistent, visitorAddress );
}
public AuthenticationResult Authenticate( string customer, string userName, string password, bool persistent, string visitorAddress )
{
AuthenticationResult result = ValidateInput( userName, password );
if( ! result.Success )
return result;
string passwordHash = GetCryptographicHash( password );
T user = userProvider.AuthenticateUser( customer, userName, passwordHash );
if( user == null )
return new AuthenticationResult( false, "Unable to login using the specified credentials.", null );
if( ! IsAuthorizedVisitor( user, visitorAddress ) )
return new AuthenticationResult( false, "Credentials do not allow login from your current IP address.", null );
CurrentPrincipal = new CodeworksPrincipal<T>( userName, userProvider.GetRoles( user ), user );
// remember to change CookieParameterCount if you change parameter count here
string cookieData = String.Format( "{0}|{1}|{2}", CurrentIdentity.Name, customer, CurrentPrincipal.AllRoles );
persistenceProvider.SetAuthCookie( 1, userName, DateTime.Now.AddMonths( 1 ), persistent, cookieData );
// TODO create an audit log entry for the current request
return new AuthenticationResult( true, null, null );
}
private AuthenticationResult ValidateInput( string login, string password )
{
var result = new AuthenticationResult( true, "Invalid or missing credentials." );
if( String.IsNullOrEmpty( login ) )
{
result.Success = false;
result.Errors.Add( "login", "You must specify an alias or email address." );
}
if( String.IsNullOrEmpty( password ) )
{
result.Success = false;
result.Errors.Add( "password", "You must specify a password." );
}
// TODO add message to inform users of other requirements.
return result;
}
#endregion
#region Cookie Authentication
public void CookieAuthenticate( string visitorAddress )
{
HttpCookie cookie = persistenceProvider.GetAuthCookie();
if( cookie != null )
{
string userName;
string userData = persistenceProvider.GetAuthCookieValue( out userName );
string[] cookieData = userData.Split( '|' );
// extract data from cookie
bool isValid = cookieData.Length == CookieParameterCount &&
! string.IsNullOrEmpty( cookieData[ 0 ] ) &&
cookieData[ 0 ] == userName &&
IsAuthorizedVisitor( cookieData[ 1 ], cookieData[ 0 ], visitorAddress );
if( isValid )
{
string customer = cookieData[ 1 ];
string[] roles = cookieData[ 2 ].Split( ',' );
T user = userProvider.GetUser( customer, userName );
CurrentPrincipal = new CodeworksPrincipal<T>( userName, roles, user );
}
}
}
#endregion
#region Logout
public void Logout()
{
// logout the current user
if( HttpContext.Current.Request.IsAuthenticated || CurrentPrincipal != null )
{
long address = GetAddressFromString( HttpContext.Request.UserHostAddress );
// TODO add audit log entry
// sign out current user
persistenceProvider.RemoveAuthCookie();
CurrentPrincipal = null;
}
}
#endregion
#region VisitorAddress Checks
public long GetAddressFromString( string address )
{
IPAddress ipAddress;
if( IPAddress.TryParse( address, out ipAddress ) )
{
byte[] segments = ipAddress.GetAddressBytes();
long result = 0;
for( int i = 0; i < segments.Length; i++ )
{
result += segments[ i ] << (i * 8);
}
return result;
}
return long.MaxValue;
}
public bool IsAuthorizedVisitor( string customer, string userName, string visitorAddress )
{
return IsAuthorizedVisitor( customer, userName, GetAddressFromString( visitorAddress ) );
}
public bool IsAuthorizedVisitor( string customer, string userName, long visitorAddress )
{
T user = userProvider.GetUser( customer, userName );
return IsAuthorizedVisitor( user, visitorAddress );
}
public bool IsAuthorizedVisitor( T user, string visitorAddress )
{
return IsAuthorizedVisitor( user, GetAddressFromString( visitorAddress ) );
}
public bool IsAuthorizedVisitor( T user, long visitorAddress )
{
if( user == null || visitorAddress == 0 )
return false;
if( user.Hosts.Count == 0 )
return true;
foreach( Host host in user.Hosts )
{
if( IsAuthorizedVisitor( host.HostAddress, host.HostMask, visitorAddress ) )
return true;
}
return true;
}
public bool IsAuthorizedVisitor( long allowedAddress, long allowedMask, long visitorAddress )
{
long requireMask = allowedAddress & allowedMask;
return (visitorAddress & requireMask) == requireMask;
}
#endregion
#region Cryptographic Helpers
public static string GetCryptographicHash( string password )
{
SHA256 hash = SHA256.Create();
byte[] input = Encoding.UTF8.GetBytes( password );
byte[] output = hash.ComputeHash( input );
return Convert.ToBase64String( output );
}
#endregion
}
如果你不需要的话,你可以去掉这些位来检查访问者的主机地址。
即使它本身不是成员(member)提供者,我也希望这能有所帮助 ;-)
关于c# - ASP.NET:在哪里可以找到快速的自定义成员资格提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2614965/
我试图对 ASP.Net MVC 有一个高层次的理解,我开始意识到它看起来很像原始的 ASP 脚本。过去,我们将“模型”/业务逻辑代码组织到 VBScript 类或 VB COM 组件中。 当然,现在
我已经搜索了一段时间,但似乎找不到答案。 我想在我的旋转木马中显示一个计数器,左边是当前项目(工作),左边是项目总数。 我的代码:
. 最佳答案 Scott Gu 称这些为代码块。这就是我的看法。 http://weblogs.asp.net/scottgu/archive/2010/04/06/new-lt-gt-syntax
我有一个使用 Visual Studio 2010/.net 4/VB 制作的网站。 我真的很喜欢我发现的 FAQ 系统的布局,因为它很简单,但它是经典的 asp。所以,显然,我不能包括我的母版页布局
好吧,对于你们许多人来说,这个问题可能有一个非常明显的答案,但它让我难住了。 我有一个 asp.net Web 表单,上面有两个控件(嗯,不止这两个,但我们将重点关注这些) - 第一个是 asp:dr
当我将 ASP.NET 复选框控件设置为 asp.net 更新面板的异步回发触发器时,EventName 属性是什么? 最佳答案 我相信它是 CheckedChanged。 关于asp.net - a
我有一个用经典 asp 编写的(巨大的)网站。现在我必须切换到 vb.net (razor)。有没有办法将这两个结合起来直到切换完成? 有没有办法让应用程序与经典的 asp 和 vb.net 一起工作
I am creating a products page, where the user selects an option in a radiobuttonlist for example, an
我最近将一个经典的 ASP 应用程序转换为 ASP.NET 3.5,但我觉得我的经典 ASP 版本要快一些(我不知道可能买家会后悔)。 所以你们能帮我解决这个问题吗,让我知道哪个更快,asp、asp.
从本周开始,我被要求开始学习如何使用 ASP 开发网站。我通过 XNA 对 C# 有一定的经验,所以这部分对我来说并不是什么麻烦。 我一直在关注Music Store Tutorial这需要我设置一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我想将一些表单变量发布到经典 ASP 页面中。我不想改变经典的 ASP 页面,因为需要完成大量的工作,以及消耗它们的页面数量。 经典的 ASP 页面需要将表单变量 Username 和 Userpas
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在某种程度上,这可能是一个异端问题。我们有一个大型站点,其中许多页面仍在ASP中。通常,并没有真正动态的,而是包括(通过SSI或Server.Execute)定期重新生成的HTML块。看起来好像是一个
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我有一个遗留的 ASP 应用程序——在不久的某个时候——需要迁移到 ASP.Net 2.0(以与也在 2.0 中的其他应用程序兼容)。 对于这类事情是否有最佳实践,即作为第一步将当前 html、vbs
我目前在一家公司工作,该公司使用 ASP.NET Webforms 和旧 ASP 页面的组合进行 Web 开发。这对于他们当前的项目来说效果很好,但我想说服/建议他们切换到 ASP.NET MVC,因
我有一个经典的 asp 应用程序。我想将该页面的竞赛表格发布到 Asp.Net 表格。原因是我想在进入数据库之前使用我在 Asp.Net 页面中内置的大量逻辑进行验证,而我对 asp 不太了解。更不用
我知道在 ASP.NET MVC 中,您可以拥有移动 View 并执行类似 Index.mobile.cshtml 的操作。和 _Layout.mobile.cshtml并且服务器知道将这些 View
我需要从一些服务器端 c#.net 代码中调用经典 asp 页面上的 VBscript 函数 - 有谁知道一种干净的方法来做到这一点?在 .net 中重写函数不是一种选择。 我会再解释一下这个问题..
我是一名优秀的程序员,十分优秀!