我正在使用Microsoft的成员资格和角色提供程序实现基于角色的安全性.
我遇到的理论问题是你在一个方法上实现一个特定的角色,例如:
[PrincipalPermissionAttribute(SecurityAction.Demand, Role="Supervisor")]
private void someMethod() {}
Run Code Online (Sandbox Code Playgroud)
如果在某些时候,我不希望主管再访问someMethod()?
我不是必须更改源代码才能进行更改吗?我错过了什么吗?
似乎必须有一些方法来抽象监督者角色和方法之间的关系,这样我就可以在应用程序中创建一种方法来改变角色权限与方法的这种耦合.
任何见解或方向将不胜感激.谢谢.
不幸的是,我在网上找到的自定义角色和成员提供商背后的表单身份验证代码的所有示例都是用VB.NET代码编写的,我需要一个C#代码.请帮忙!!!!
我需要一个代码隐藏,它将执行以下操作:
Default.aspx代码:
<asp:Login ID="LoginUser" runat="server" EnableViewState="false" RenderOuterTable="false">
<LayoutTemplate>
<span class="failureNotification">
<asp:Literal ID="FailureText" runat="server"></asp:Literal>
</span>
<asp:ValidationSummary ID="LoginUserValidationSummary" runat="server" CssClass="failureNotification"
ValidationGroup="LoginUserValidationGroup"/>
<div class="accountInfo">
<fieldset class="login">
<legend>Account Information</legend>
<p>
<asp:Label ID="usernameLabel" runat="server" AssociatedControlID="username">Username:</asp:Label>
<asp:TextBox ID="username" runat="server" CssClass="textEntry"></asp:TextBox>
<asp:RequiredFieldValidator ID="UserNameRequired" runat="server" ControlToValidate="username"
CssClass="failureNotification" ErrorMessage="User Name is required." ToolTip="User Name is required."
ValidationGroup="LoginUserValidationGroup">*</asp:RequiredFieldValidator>
</p>
<p>
<asp:Label ID="passwordLabel" runat="server" AssociatedControlID="password">Password:</asp:Label>
<asp:TextBox ID="password" runat="server" CssClass="passwordEntry" …Run Code Online (Sandbox Code Playgroud) c# asp.net forms-authentication roleprovider membership-provider
在我的应用程序中,我需要检查loggind用户的角色,以确定用户是否可以看到某些控件
首先我使用MS的loginview模板,但由于我没有用户db,因此我没有角色db所以我无法添加角色提供程序,所以我无法使用Role类来检查用户\角色
在我的情况下,我有一个会话,其中包含用户信息和他拥有的角色,我需要对这些角色进行检查,以设置将为用户启用哪个控件,但标准方式是"在类或代码中使用.net"
我的应用程序具有自定义角色和成员资格提供程序.我已经注册他们在web.config中,但是当我尝试这样做if(User.IsInRole("Blah")),既不是我在RoleProvider的断点Initialize或IsUserInRole被击中.会员提供商工作正常,所以我想我必须从web.config中遗漏一些东西.这就是我所拥有的:
<system.web>
...
<membership defaultProvider="MyAppMembershipProvider" userIsOnlineTimeWindow="15">
<providers>
<clear />
<add name="MyAppMembershipProvider"
type="MyAppMembership.MyAppMembershipProvider"
connectionStringName="MyApp"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" writeExceptionsToEventLog="false" />
</providers>
</membership>
<roleManager defaultProvider="MyAppRoleProvider">
<providers>
<clear />
<add name="MyAppRoleProvider"
type="MyAppMembership.MyAppRoleProvider"
connectionStringName="MyApp"
enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" writeExceptionsToEventLog="false" />
</providers>
</roleManager>
</system.web>
Run Code Online (Sandbox Code Playgroud)
还有其他我需要的东西吗?
asp.net iis asp.net-membership roleprovider membership-provider
我为项目实现了一个自定义RoleProvider.RoleProvider可以工作,但我用来获取用户角色的存储库仅在构建后填充.当我logOff,更改用户的角色,再次登录时,用户仍然保留旧角色.
public class CmsRoleProvider : RoleProvider
{
private EntityDB _db { get; set; }
public CmsRoleProvider()
{
_db = new EntityDB();
}
public override string[] GetRolesForUser(string username)
{
var user = _db.Users.Where(u => u.EmailAddress == username).SingleOrDefault();
var roles = user.UserRoles.Select(u => u.Role.Name).ToList<string>();
return roles.ToArray();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,用户只在构建项目后才能获得正确的角色.当我在GetRolesForUser函数中创建存储库时,它工作正常.
是否存在缓存问题?谁可以帮助我.
具有讽刺意味的是,我的角色提供者不再将角色缓存在cookie中.那是在早些时候工作.不幸的是,我注意到只有现在,所以我不能说是什么导致了这个问题.但我认为这与通用提供商的新版本1.2(8月16日发布)的更新有关.
我对roleprovider的配置如下:
<roleManager enabled="true" cacheRolesInCookie="true" cookieName="X_Roles"
cookiePath="/" cookieProtection="All" cookieRequireSSL="true" cookieSlidingExpiration="true" cookieTimeout="1440"
createPersistentCookie="false" domain="" maxCachedResults="25" defaultProvider="XManager_RoleProvider">
<providers>
<clear/>
<add name="XManager_RoleProvider" type="ManagersX.XManager_RoleProvider, AssemblyX"
connectionStringName="XEntities" applicationName="/" rolesTableName="Roles" roleMembershipsTableName="Users_Roles"/>
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
使用rolemanager(loginviews,带有sitemaptrimming等的菜单)一切正常,但它不再缓存角色了.会员提供者,会话状态等也正常工作,并且正确设置了它们的cookie.
静态Roles类的所有属性都已正确设置,Httpcontext(IsSecureConnection等)中的所有属性也都是正确的.
角色cookie是先前设置的,但不再是.我希望有人可以帮我解决我的问题.
提前致谢.
最好的祝福,
HeManNew
更新: 请问我没有人遇到同样的问题或提示吗?
Web.Config 中的成员资格和角色提供者的等效配置是什么:
<appSettings>
<add key="enableSimpleMembership" value="true" />
</appSettings>
Run Code Online (Sandbox Code Playgroud)
在 ASP.NET MVC 4 中?
我已经为我的MVC4应用程序创建了一个自定义角色提供程序,我已成功覆盖CreateRole,GetAllRoles和RoleExists方法,并将它们链接到我现有的数据库,如下所示:
namespace Project.Providers
{
public class MyProvider : System.Web.Security.SqlRoleProvider
{
private MyContext dbcontext = new MyContext(System.Configuration.ConfigurationManager.ConnectionStrings["MyContext"].ConnectionString);
private Repository<MyUser> userRepository;
private Repository<Role> roleRepository;
public MyProvider()
{
this.userRepository = new Repository<MyUser>(dbcontext);
this.roleRepository = new Repository<Role>(dbcontext);
}
public override string[] GetAllRoles()
{
IEnumerable<Role> dbRoles = roleRepository.GetAll();
int dbRolesCount = roleRepository.GetAll().Count();
string[] roles = new string[dbRolesCount];
int i = 0;
foreach(var role in dbRoles)
{
roles[i] = role.Name;
i++;
}
return roles;
}
public override bool RoleExists(string roleName)
{
string[] roles = { "Admin", …Run Code Online (Sandbox Code Playgroud) 此堆栈跟踪是由于"提供程序名称不能为null或为空"的错误导致的.
[ArgumentException:提供程序名称不能为null或为空.] System.Web.Security.Roles.Initialize()+ 2230205 System.Web.Security.RoleManagerModule.OnLeave(Object source,EventArgs eventArgs)+68 System.Web.SyncEventExecutionStep.System .Web.HttpApplication.IExecutionStep.Execute()+ 148 System.Web.HttpApplication.ExecuteStep(IExecutionStep step,Boolean&completedSynchronously)+75
本质上我正在创建我自己的自定义角色提供程序,它继承了SqlRoleProvider类,我正在成功调用初始化并确认它成功完成了我的代码中的所有内容但是.Net中的某些内容显然没有被正确地初始化为"角色"对象我不能继承是让我有些头痛......
有任何想法吗?
好的,我的解决方案是分层的,这意味着我需要通过业务对象层提供安全性......为了做到这一点,我定义了以下内容:
---编辑1 ---
我的代码:
在主要装配中:
public class C20RoleProvider : RoleProvider
{
private C20SqlRoleDataProvider prov;
C20RoleProvider()
{
// this code is actually using some reflection based on config files
// i have simplified this to illustrate the problem im having ...
prov = new C20SqlRoleDataProvider();
}
public override void Initialize(string name, NameValueCollection config)
{
prov.Initialize(name, config);
}
}
Run Code Online (Sandbox Code Playgroud)
在提供者组装中:
public class C20SqlRoleDataProvider : SqlRoleProvider
{
// code …Run Code Online (Sandbox Code Playgroud) 我已经为ASP.NET应用程序实现了一个自定义角色提供程序.我从System.Web.Security.RoleProvider派生了我的类,并实现了所有抽象方法和属性.我正在使用web.config中的applicationName配置我的提供程序,àla:
<roleManager enabled="true" defaultProvider="CustomRoleProvider">
<providers>
<clear/>
<add name="CustomRoleProvider" type="MvcApplication1.CustomRoleProvider" applicationName="Foo"/>
</providers>
</roleManager>
Run Code Online (Sandbox Code Playgroud)
但是,我的提供程序的ApplicationName属性未相应设置.为什么?
roleprovider ×10
asp.net ×4
.net ×2
c# ×2
asp.net-mvc ×1
cookies ×1
iis ×1
isinrole ×1
membership ×1
roles ×1
web-config ×1
winforms ×1