【问题标题】:Use Windows Authentication to get User ID with .Net Identity for Role Management使用 Windows 身份验证获取具有 .Net 身份的用户 ID 以进行角色管理
【发布时间】:2016-01-22 05:45:31
【问题描述】:

我们有一个使用 ASP.NET 5 aka vNext 和 MVC 6 开发的 Intranet 站点。

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

基本上在 Startup.cs 我在配置服务中有类似下面的内容:

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

下一个配置我有:app.UseIdentity();

Windows 身份验证在项目属性级别启用,匿名也是如此。我看不到实际获取 Windows 用户 ID 的方法。

【问题讨论】:

  • 我将删除我的答案,因为它不起作用。但我不希望它看起来像是在逃避我的承诺,所以......一旦 48 小时 SO 初始等待结束,并且我被允许开始赏金,我将开始赏金并奖励 100 个代表点给第一个正确回答这个问题的人,无论答案是在赏金之前还是之后。
  • 布莱恩,你看过这个stackoverflow.com/a/10584919/4843530。让我知道它是否有帮助,因为我想尝试解决它。似乎我们有非常相似的需求和问题。
  • 对不起,我之前错过了。这是一个好主意,但在 IIS Express 下运行代码,代码“var username = Thread.CurrentPrincipal.Identity.Name;”只为用户名返回一个空字符串。可能有一种方法可以进入 IIS Express 配置文件以使其返回 Windows ID。也会试试的。

标签: asp.net asp.net-mvc-5 windows-authentication ntlm asp.net-identity-3


【解决方案1】:

警告:这是 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 放入您的配置。

根据您的要求,这似乎是您所需要的,如果需要任何进一步的解释,请告诉我。

【讨论】:

  • 这不起作用,因为只要 Allow Anonymous 为 true,它就永远不会获取传入的 Windows 网络 ID。因此 IsAuthenticated 始终为 false。如果我将 Allow Anonymous 设置为 false 并将 Windows Authentication 设置为 True,则 isAuthenticated 始终为 true,并且用户 ID 始终存在,但 .Net Identity 的所有角色管理功能都会被忽略。我要稍微修改一下我的帖子。
  • 可以通过仅使用 Windows 身份验证而不是 .NET 身份验证来实现您想要的。是否有特定原因需要 .NET 身份验证而不是 Windows?编辑:如果我可以为您提供一个工作示例。
  • 我想我想要两全其美。我不希望通过网络认证的用户必须第二次输入他们的用户 ID 和密码(实际上这是一项要求)。但是现有的数据库具有所有角色信息以及一些用于派生角色的业务逻辑。我能够实现一个自定义的 Asp.Net 身份提供程序,只要我有一个登录表单,我可以在其中重新输入凭据,然后通过 LDAP 确认 ID 和密码正确无误。
  • 如果你有一个可以提供的工作示例,我会喜欢的。
  • 另请注意,这是一个 ASP.NET 5 应用程序,这意味着不再有 web.config。也没有 Global.asax。只是一个注册服务的启动类。必须有一种好方法可以在某个地方做到这一点。
【解决方案2】:

所以我仍然希望有人提出更好的答案,因为我的目标仍然是在使用 Windows 用户 ID 对用户进行身份验证后使用和利用 .Net Identity 进行授权。但是现在,我将启用 Windows 身份验证并使用 Rick 在此线程中提供的自定义授权选项的解决方案: 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 Identity 已经提供的内容,而无需为每个角色编写自己的代码。我必须使用自己的缓存,所以每次我想检查用户是否有权限时都不需要返回数据库。必须有更好的方法...

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 2018-05-25
    • 2011-09-18
    • 1970-01-01
    • 2013-07-10
    • 2018-08-26
    • 1970-01-01
    • 2020-05-30
    • 2015-09-16
    相关资源
    最近更新 更多