ASP용 사용자 정의 구성원 자격 공급자를 생성하려면 어떻게 해야 합니까?NET MVC 2?
ASP에 대한 사용자 지정 구성원 자격을 만들려면 어떻게 해야 합니까?ASP를 기반으로 한 NET MVC 2.NET 멤버십 제공업체?
사용자 지정 구성원 자격 공급자를 포함하는 새 프로젝트를 생성한 후ValidateUser
의 방법MembershipProvider
추상 클래스:
public class MyMembershipProvider : MembershipProvider
{
public override bool ValidateUser(string username, string password)
{
// this is where you should validate your user credentials against your database.
// I've made an extra class so i can send more parameters
// (in this case it's the CurrentTerritoryID parameter which I used as
// one of the MyMembershipProvider class properties).
var oUserProvider = new MyUserProvider();
return oUserProvider.ValidateUser(username,password,CurrentTerritoryID);
}
}
그런 다음 그 공급자를 내 ASP에 연결했습니다.NET MVC 2는 참조를 추가하고 내 웹.config에서 지적함으로써 프로젝트를 수행합니다.
<membership defaultProvider="MyMembershipProvider">
<providers>
<clear />
<add name="MyMembershipProvider"
applicationName="MyApp"
Description="My Membership Provider"
passwordFormat="Clear"
connectionStringName="MyMembershipConnection"
type="MyApp.MyMembershipProvider" />
</providers>
</membership>
다음을 상속하는 사용자 지정 클래스를 만들어야 합니다.RoleProvider
클래스를 추상화하고 재정의합니다.GetRolesForUser
방법.ASP.NET MVC Authorizing은 이 방법을 사용하여 현재 로그온한 사용자에게 할당된 역할을 확인하고 사용자가 컨트롤러 작업에 액세스할 수 있는지 확인합니다.
다음은 우리가 취해야 할 단계입니다.
RoleProvider 추상 클래스를 상속하고 GetRolesForUser 메서드를 재정의하는 사용자 지정 클래스를 만듭니다.
public override string[] GetRolesForUser(string username)
{
SpHelper db = new SpHelper();
DataTable roleNames = null;
try
{
// get roles for this user from DB...
roleNames = db.ExecuteDataset(ConnectionManager.ConStr,
"sp_GetUserRoles",
new MySqlParameter("_userName", username)).Tables[0];
}
catch (Exception ex)
{
throw ex;
}
string[] roles = new string[roleNames.Rows.Count];
int counter = 0;
foreach (DataRow row in roleNames.Rows)
{
roles[counter] = row["Role_Name"].ToString();
counter++;
}
return roles;
}
역할 공급자를 ASP와 연결합니다.웹.config를 통한 NET MVC 2 애플리케이션:
<system.web>
...
<roleManager enabled="true" defaultProvider="MyRoleProvider">
<providers>
<clear />
<add name="MyRoleProvider"
applicationName="MyApp"
type="MyApp.MyRoleProvider"
connectionStringName="MyMembershipConnection" />
</providers>
</roleManager>
...
</system.web>
원하는 컨트롤러 / 작업 위에 인증(Roles="xxx,yyy")을 설정합니다.
[Authorization(Roles = "Customer Manager,Content Editor")]
public class MyController : Controller
{
......
}
바로 그거야!이제 작동합니다!
선택 사항: 사용자 지정 설정Authorize
원치 않는 역할을 액세스 거부 페이지로 리디렉션할 수 있는 속성:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MyAuthorizationAttribute : AuthorizeAttribute
{
/// <summary>
/// The name of the master page or view to use when rendering the view on authorization failure. Default
/// is null, indicating to use the master page of the specified view.
/// </summary>
public virtual string MasterName { get; set; }
/// <summary>
/// The name of the view to render on authorization failure. Default is "Error".
/// </summary>
public virtual string ViewName { get; set; }
public MyAuthorizationAttribute ()
: base()
{
this.ViewName = "Error";
}
protected 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 (AuthorizeCore(filterContext.HttpContext))
{
SetCachePolicy(filterContext);
}
else if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
// auth failed, redirect to login page
filterContext.Result = new HttpUnauthorizedResult();
}
else if (filterContext.HttpContext.User.IsInRole("SuperUser"))
{
// is authenticated and is in the SuperUser role
SetCachePolicy(filterContext);
}
else
{
ViewDataDictionary viewData = new ViewDataDictionary();
viewData.Add("Message", "You do not have sufficient privileges for this operation.");
filterContext.Result = new ViewResult { MasterName = this.MasterName, ViewName = this.ViewName, ViewData = viewData };
}
}
protected 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 */);
}
}
이제 자체 제작 속성을 사용하여 거부된 보기에 액세스하도록 사용자를 리디렉션할 수 있습니다.
[MyAuthorization(Roles = "Portal Manager,Content Editor", ViewName = "AccessDenied")]
public class DropboxController : Controller
{
.......
}
바로 그거야!완전 바보야!
다음은 이 모든 정보를 얻기 위해 사용한 링크 중 일부입니다.
사용자 지정 역할 공급자: http://davidhayden.com/blog/dave/archive/2007/10/17/CreateCustomRoleProviderASPNETRolePermissionsSecurity.aspx
이 정보가 도움이 되길 바랍니다!
이것은 저에게 효과가 있었습니다. http://mattwrock.com/post/2009/10/14/Implementing-custom-Membership-Provider-and-Role-Provider-for-Authinticating-ASPNET-MVC-Applications.aspx
훨씬 더 적은 양의 코드로 이 방법을 사용하는 것도 가능합니다. 이 방법이 안전한지는 완전히 확신할 수 없지만 사용하는 데이터베이스에서 매우 잘 작동합니다.
전세계적으로
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.User != null)
{
if (HttpContext.Current.User.Identity.IsAuthenticated)
{
if (HttpContext.Current.User.Identity is FormsIdentity)
{
FormsIdentity id =
(FormsIdentity)HttpContext.Current.User.Identity;
FormsAuthenticationTicket ticket = id.Ticket;
// Get the stored user-data, in this case, our roles
string userData = ticket.UserData;
string[] roles = userData.Split(',');
HttpContext.Current.User = new GenericPrincipal(id, roles);
}
}
}
}
이것이 하는 일은 양식에서 만들어진 authCookie에서 역할을 읽는 것입니다.인증티켓
로그온 로직은 다음과 같습니다.
public class dbService
{
private databaseDataContext db = new databaseDataContext();
public IQueryable<vwPostsInfo> AllPostsAndDetails()
{
return db.vwPostsInfos;
}
public IQueryable<role> GetUserRoles(int userID)
{
return (from r in db.roles
join ur in db.UsersRoles on r.rolesID equals ur.rolesID
where ur.userID == userID
select r);
}
public IEnumerable<user> GetUserId(string userName)
{
return db.users.Where(u => u.username.ToLower() == userName.ToLower());
}
public bool logOn(string username, string password)
{
try
{
var userID = GetUserId(username);
var rolesIQueryable = GetUserRoles(Convert.ToInt32(userID.Select(x => x.userID).Single()));
string roles = "";
foreach (var role in rolesIQueryable)
{
roles += role.rolesName + ",";
}
roles.Substring(0, roles.Length - 2);
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(
1, // Ticket version
username, // Username associated with ticket
DateTime.Now, // Date/time issued
DateTime.Now.AddMinutes(30), // Date/time to expire
true, // "true" for a persistent user cookie
roles, // User-data, in this case the roles
FormsAuthentication.FormsCookiePath);// Path cookie valid for
// Encrypt the cookie using the machine key for secure transport
string hash = FormsAuthentication.Encrypt(ticket);
HttpCookie cookie = new HttpCookie(
FormsAuthentication.FormsCookieName, // Name of auth cookie
hash); // Hashed ticket
// Set the cookie's expiration time to the tickets expiration time
if (ticket.IsPersistent) cookie.Expires = ticket.Expiration;
// Add the cookie to the list for outgoing response
HttpContext.Current.Response.Cookies.Add(cookie);
return true;
}
catch
{
return (false);
}
}
}
역할을 두 개의 테이블과 함께 데이터베이스에 저장합니다. 테이블: 열이 있는 역할: roleID 및 roleName과 테이블:사용자 ID 및 역할 열이 있는 사용자 역할ID, 이렇게 하면 여러 사용자가 여러 역할을 수행할 수 있으며 사용자에게 역할을 추가/제거하는 등의 작업을 수행할 수 있습니다.이렇게 하면 [Authorize(Roles=)]를 사용할 수 있습니다.슈퍼 관리자")]를 예로 들 수 있습니다.이게 도움이 되길 바랍니다.
edit: 비밀번호 검사를 잊었지만 제공된 사용자 이름과 비밀번호가 확인되는지 확인하고 그렇지 않으면 false를 반환하는 logOn 메서드에 if만 추가합니다.
나우크 잇을 사용했습니다.포스트그레SQL 공급자의 소스 코드를 기본으로 사용하여 내 요구에 맞게 수정했습니다.
언급URL : https://stackoverflow.com/questions/2771094/how-do-i-create-a-custom-membership-provider-for-asp-net-mvc-2
'programing' 카테고리의 다른 글
jquery를 tampermonkey 스크립트에 로드하려고 합니다. (0) | 2023.08.05 |
---|---|
HTML 테이블의 데이터 테이블 (0) | 2023.08.05 |
다른 PC에서 라라벨 앱에 액세스하려면 어떻게 해야 합니까? (0) | 2023.08.05 |
WHERE가 작동하지 않는 다중 테이블 업데이트 (0) | 2023.08.05 |
장고 모델에서 필드의 기본값을 설정하려면 어떻게 해야 합니까? (0) | 2023.08.05 |