0

我们有我们在ASP.NET开发5 Intranet站点又名vNext和MVC 6使用Windows身份验证来获得用户ID与.net身份的角色管理

我们希望能够得到用户登录的Windows网络标识为,但是现在的数据库定义了角色等,我们将利用并已经这样做。真的,我想要做的就是获取Windows用户标识,同时使用ASP.NET标识来管理用户有权访问的角色。任何建议如何做到这一点?

基本上Startup.cs我在配置服务类似如下:

services.AddIdentity<WorldUser, IdentityRole>(config => 
    { 
     config.User.RequireUniqueEmail = true; 
     config.Password.RequiredLength = 8; 
    }).AddEntityFrameworkStores<WorldContext>(); 

接下来在配置我:app.UseIdentity();

Windows验证在项目属性级别打开,Anonymous也是。我看不到实际获得Windows用户ID的方法。

+0

我要删除我的答案,因为它不起作用。但我不希望它看起来像是在推卸我的承诺,所以......一旦48小时的初始等待结束,我可以开始赏金,我将开始赏金并奖励100分给第一个正确回答的人,答案是在奖金之前还是之后。 – AgapwIesu

+0

Brian,你看过这个http://stackoverflow.com/a/10584919/4843530。让我知道是否有帮助,因为我想尝试解决它。似乎我们有一个非常相似的需求和问题。 – AgapwIesu

+0

对不起,我很早就错过了。这是一个很好的想法,但在IIS Express下运行代码,即代码“var username = Thread.CurrentPrincipal.Identity.Name;”只是为User Name返回一个空字符串。可能有办法进入IIS Express配置文件以使其返回Windows ID。也会尝试。 –

回答

0

警告:这是一个ASP.NET 4.5的代码不是5

将这个是你的web.config:

<system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" maxRequestLength="20480" /> 
    <authentication mode="Windows" /> 
    <authorization> 
     <deny users="?" />     <!--Denies access to the anonymous user.--> 
     <allow users="MydomainName\MyUsername" />  <!--Grants access to this user.--> 
     <allow roles="MyWindowsGroup" /> 
     <deny users="*" />     <!--Denies access to everyone. This shakes out as everyone except the defined users/usergroupt that are rganted access manualy.--> 
    </authorization> 
</system.web> 

这种方式,你必须有一个Windows网络用户ID。 Intranet应用程序中用户始终拥有哪些内容。然后,只需使用:

HttpContext.Current.User.Identity.Name 

和以前一样。就像这样:

String name = User.Identity.Name; 
// If needed filter out the domain name here 
int accessLevel = _UserRepository.GetAccessLevel(name) 
// Assuming you use a repository to connect to your database. And also have a method to get the accesslevel for a username 
Session["AccessLevel"] = accessLevel; 
// In case you want to check for accesslevel in the views as well you can put it in a session like so. 

再次,这是一个.NEET 4.5和一个.NET 5应用程序代码。 C#代码应该是相同的,但在.NET 5中没有web.config,因此您必须通过Startup.cs将您的配置置入。

从你在问什么这似乎是你需要的,如果需要进一步的解释让我知道。

+0

这不起作用,因为只要Allow Anonymous为真,它就永远不会传入Windows网络ID。因此IsAuthenticated始终为false。如果我将允许匿名设置为false,并将Windows身份验证设置为True,那么isAuthenticated始终为true,并且用户标识始终存在,但是.Net标识的所有角色管理功能都会被忽略。我将稍微编辑我的帖子。 –

+0

通过使用Windows身份验证而不是.NET身份验证,可以获得您想要的内容。是否有一个特定的原因,你想要.NET认证,而不是Windows?编辑:如果你我可以为你提供一个工作的例子。 –

+0

我想我想要两全其美。我不希望通过网络验证的用户第二次输入其用户名和密码(实际上这是要求)。但是现有的数据库具有所有角色信息以及一些业务逻辑来派生角色。我能够实现一个自定义的Asp.Net身份提供者,只要我有一个登录表单,我重新输入凭据,然后通过LDAP确认身份和密码是正确的,它就可以很好地工作。 –

0

因此,我仍然希望有人提出更好的答案,因为我的目标仍然是在使用Windows用户标识对用户进行身份验证后使用和利用.Net身份进行授权。但现在,我要启用Windows身份验证和使用该解决方案定制里克在这个线程提供的授权选项: How do you create a custom AuthorizeAttribute in ASP.NET Core?

所以我会做以下,为每个角色创建一个类如下:

public class ETimeAdmin : AuthorizationHandler<ETimeAdmin>, IAuthorizationRequirement 
    { 
     protected override void Handle(AuthorizationContext context, ETimeAdmin requirement) 
     { 



     } 
    } 

然后在Startup.cs在配置服务,我会补充:

services.AddAuthorization(options => options.AddPolicy("ETimeAdmin", policy => policy.Requirements.Add(new ETimeAdmin()))); 

最后,我应该能够使用:

[Authorize(Roles="ETimeAdmin")] 

而不是做上述情况,我想Startup.cs做的就是加入这一行:

 services.AddIdentity<ETimeUser, IdentityRole>(config => 
    { 
    }).AddEntityFrameworkStores<ETimeContext>(); 

然后,我可以只使用什么是已经提供与.net身份,而无需编写我的自己的代码为每个角色。我不得不使用自己的缓存,因此每次我想检查用户是否有权限时都不需要返回数据库。必须有更好的方法...

相关问题