0

ASP.NET 5 aka vNext および MVC 6 で開発中のイントラネット サイトがあります。

ユーザーがログインしている Windows ネットワーク ID を取得できるようにしたいのですが、ロールなどを定義する既存のデータベースがあります。利用しようとしていて、既に利用しています。本当にやりたいことは、ASP.NET ID を使用してユーザーがアクセスできるロールを管理しながら、Windows ユーザー ID を取得することだけです。これを達成する方法について何か提案はありますか?

基本的に Startup.cs には、Configure Services に以下のようなものがあります。

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

次の Configure には次のようなものがあります: app.UseIdentity();

Windows 認証はプロジェクト プロパティ レベルでオンになっており、匿名も同様です。Windows ユーザー ID を実際に取得する方法がわかりません。

4

2 に答える 2

0

私の目標は、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)
       {



       }
    }

次に、configure services の 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 で既に提供されているものを使用できます。ユーザーにアクセス許可があるかどうかを確認するたびにデータベースに戻る必要がないように、独自のキャッシュを使用する必要がありました。もっと良い方法があるはずです...

于 2015-10-23T18:20:33.440 に答える
0

警告: これは ASP.NET 5 ではなく 4.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 が必要です。ユーザーがイントラネット アプリケーションで常に持っているもの。次に、次を使用します。

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.

繰り返しますが、これは.NET 5 アプリケーションでなく .NEET 4.5 のコードです。C# コードは同一である必要がありますが、.NET 5 には web.config がないため、Startup.cs を介して構成を配置する必要があります。

あなたが求めていることから、これはあなたが必要としているもののように思えます。さらに説明が必要な場合はお知らせください。

于 2015-10-22T20:29:56.067 に答える