我有一个Web应用程序,用户需要创建/编辑/删除帖子操作的权限。根据Windows用户名和自定义角色名称在数据库中的自定义表中处理权限。
这是我的代码:
var username = Environment.UserName;
using (HostingEnvironment.Impersonate())
{
var ctx = new PrincipalContext(ContextType.Domain);
var user = UserPrincipal.FindByIdentity(ctx, username);
if (user != null)
{
var roleName = accessRepository.GetRole(username);
if (string.IsNullOrEmpty(roleName) || roleName != Roles.admin.ToString())
{
hasAccess = false;
}
}
else
{
hasAccess = false;
}
if (!hasAccess)
{
// redirect
}
}
在web.config中我有
<authentication mode="Windows" />
我尝试过设置
<identity impersonate="true" />
但它不起作用。在服务器上,我尝试设置IIS以在三者的所有变体中启用Asp.Net Impersonate和匿名访问以及Windows身份验证。
当我在我的机器上本地运行时没有问题,username
是我登录到我的机器时Windows身份验证的用户名。
但是当我将其上传到服务器并转到本地计算机上的网站时,username
是来自服务器的用户名,而不是来自我本地计算机的用户名。
为了清楚起见,我不希望用户登录Web应用程序。我希望Web应用程序从活动目录中找出Windows身份验证。
这不可能吗?或者我认为不对?
答案 0 :(得分:1)
为了清楚起见,我不希望用户登录网络 应用。我希望Web应用程序找到窗口 来自活动目录的身份验证。
这是不太有意义的部分。找出用户的AD帐户的唯一方法是他们是否对您的应用程序进行身份验证。他们不必输入凭据 - 但他们的凭据仍会发送到您的服务器,而您的服务器会验证它们是否正确。所以从这个意义上说,他们正在“登录”。
这是通过Windows身份验证实现的。你正走在正确的轨道上:
string sqlQuery ="Select Count("+columName+") from tblAttendance1 where "+columName+"='"+value+"'";
但请确保您还禁用匿名身份验证。然后您可以像这样访问用户的用户名:
<authentication mode="Windows" />
将采用DOMAIN \ Username。
的格式作为旁注,HttpContext.Current.User.Identity.Name
获取当前线程正在运行的用户名 - 基本上,IIS正在运行的凭据。在您的开发机器上,这是您的用户名(可能是因为您使用的是IIS Express)。但是在服务器上,它会有所不同。