2017-11-27 14 views
1

ログインWebページで、データベースにアカウントを作成するために使用できるwebform(Identity 2.0) Azure Active Directoryを使用して企業の電子メールで認証することができます。webform認証を使用しているときにopenidconnectで[Authorize(Roles = "xxx")]を確認する方法

私は[Authorize]属性をUserControllerのIndex()アクションを装飾するように配置しました。 [Authorize (Roles = "Admin")]

私のwebformログインでログインすると、/ MyController/List /に行くと、私はMicrosoftアカウントのログインページにリダイレクトされます。/MyController/Indexに行くと、私はリダイレクトされません。

この現象の原因は何ですか?私はユーザーがwebformでログインしているときにAzureをチェックしたくない。これを防ぐ方法を教えてください。

はここでここで私はクッキーAuthenticatoin(電子メール/パスワード)でログインしていコントローラコード

using System.Web.Mvc; 

namespace MyApp.Controllers 
{ 

    public class AccueilController : Controller 
    { 
     [Authorize] 
     public ActionResult Index() 
     { 
      return View(); 
     } 

     [Authorize(Roles = "Admin")] 
     public ActionResult List() 
     { 
      return View(); 
     } 
    } 
} 

だ私のStartup.Auth.cs

public partial class Startup 
{ 
    private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; 
    private static string appKey = ConfigurationManager.AppSettings["ida:ClientSecret"]; 
    private static string aadInstance = ConfigurationManager.AppSettings["ida:AADInstance"]; 
    private static string tenantId = ConfigurationManager.AppSettings["ida:TenantId"]; 
    private static string postLogoutRedirectUri = ConfigurationManager.AppSettings["ida:PostLogoutRedirectUri"]; 

    public static readonly string Authority = aadInstance + tenantId; 

    // This is the resource ID of the AAD Graph API. We'll need this to request a token to call the Graph API. 
    string graphResourceId = "https://graph.windows.net"; 


    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864 
    public void ConfigureAuth(IAppBuilder app) 
    { 

     // Configure the db context, user manager and role manager to use a single instance per request 
     app.CreatePerOwinContext(ApplicationDbContext.Create); 
     app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create); 
     app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create); 
     app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create); 

     // Enable the application to use a cookie to store information for the signed in user 
     // and to use a cookie to temporarily store information about a user logging in with a third party login provider 
     // Configure the sign in cookie 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Account/Login"), 
      Provider = new CookieAuthenticationProvider 
      { 
       // Enables the application to validate the security stamp when the user logs in. 
       // This is a security feature which is used when you change a password or add an external login to your account. 
       OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
        validateInterval: TimeSpan.FromMinutes(30), 
        regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager)) 
      } 
     }); 

     // Enables the application to temporarily store user information when they are verifying the second factor in the two-factor authentication process. 
     app.UseTwoFactorSignInCookie(DefaultAuthenticationTypes.TwoFactorCookie, TimeSpan.FromMinutes(5)); 

     // Enables the application to remember the second login verification factor such as phone or email. 
     // Once you check this option, your second step of verification during the login process will be remembered on the device where you logged in from. 
     // This is similar to the RememberMe option when you log in. 
     app.UseTwoFactorRememberBrowserCookie(DefaultAuthenticationTypes.TwoFactorRememberBrowserCookie); 

     // Pour Azure 
     app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions 
     { 
      ClientId = clientId, 
      Authority = Authority, 
      PostLogoutRedirectUri = postLogoutRedirectUri, 
      AuthenticationType = OpenIdConnectAuthenticationDefaults.AuthenticationType, 

      Notifications = new OpenIdConnectAuthenticationNotifications() 
      { 
       // If there is a code in the OpenID Connect response, redeem it for an access token and refresh token, and store those away. 
       AuthorizationCodeReceived = (context) => 
       { 
        var code = context.Code; 
        ClientCredential credential = new ClientCredential(clientId, appKey); 
        string signedInUserID = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.NameIdentifier).Value; 
        AuthenticationContext authContext = new AuthenticationContext(Authority, new ADALTokenCache(signedInUserID)); 
        Task<AuthenticationResult> result = authContext.AcquireTokenByAuthorizationCodeAsync(
        code, new Uri(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Path)), credential, graphResourceId); 

        return Task.FromResult(0); 
       } 
      } 
     }); 
     app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie); 


     // Uncomment the following lines to enable logging in with third party login providers 
     //app.UseMicrosoftAccountAuthentication(
     // clientId: "", 
     // clientSecret: ""); 

     //app.UseTwitterAuthentication(
     // consumerKey: "", 
     // consumerSecret: ""); 

     //app.UseFacebookAuthentication(
     // appId: "", 
     // appSecret: ""); 

     //app.UseGoogleAuthentication(
     // clientId: "", 
     // clientSecret: ""); 
    } 
} 

EDIT

です。

  1. 私はインデックスアクションをヒットしました。私はそのページのコンテンツをアプリ内に表示しています。
  2. 私がList()アクションを押すと、OpenIdConnectのログインページにリダイレクトされます。
+0

'HttpContext.User.IsInRole(" Admin ")を使用している場合、AADにリダイレクトされず、AADまたはWebformsで記録されているときにfalseを返します。 '[Authorize(Roles =" MyRole ")]'の動作はバグですか? – Philippe

+0

異なる動作を持つ2つのコントローラアクションのコード(マイナス内容)を投稿できますか? – Cam

+0

@Philippeユーザのログインは 'admin'の役割を持っていますか? –

答えて

1

webformsユーザーには管理者ロールはありませんが、ADユーザーには管理者ロールがあるようです。これを確認するには、AspNetUserRolesテーブルをすばやくクエリします。

[Authorize(Roles="Admin")]でアクションをデコレートすると、役割を持つユーザーのみがアクセスできます。許可されていないユーザのデフォルトの動作(ユーザの認証ステータスにかかわらず)をログインページにリダイレクトすることです。

  1. サブクラスAuthorizeAttributeを、デフォルトの動作をオーバーライド:

    あなたのオプションがあります。

  2. ログインページが認証されている場合は、他の場所(適切なステータスコードが設定されている禁止ページなど)をログインページからリダイレクトします。

は、私の知る限りでは、デフォルトのリダイレクトの動作は、ASP.NETコアにAuthorizeAttributeすることができますようにサブクラス化せずに上書きすることはできません。

+0

.NET Coreの動作と.NET 4の違いを示すリンクがありますか?それは何が起こっているのか理解するのに役立ちます。ありがとうございました。 – Philippe

+1

@Philippeデフォルトの動作は.NETコアと同じです。しかし、すべての認証方法がCookie認証を使用するため、[アプリケーションCookieを設定する]ことができます(https://stackoverflow.com/a/42030138/1678053)。 – gldraphael

関連する問題