2016-05-25 25 views
0

私のASP.NET MVC 5アプリケーションでは、カスタム認証を使用する必要があります。基本的には、メソッドを呼び出し、ユーザーに関する情報を含むオブジェクトを返すカスタムライブラリです。ASP.NET MVC 5:カスタム認証

私は新しいMVC 5アプリケーションを作成し、 "認証なし"オプションを選択しました。その後、私は現在、このようになりますHTTPモジュールを追加しました:

私claimstransformerはこのようになります
private void Context_AuthenticateRequest(object sender, EventArgs e) 
{ 
    // Make the call to authenticate. 
    // This returns an object with user information. 
    AuthResult result = new AuthLib().SignOn(); 

    // Inspect the returned object and create a list claims. 
    var claims = new List<Claim> 
    { 
     new Claim(ClaimTypes.NameIdentifier, result.Username), 
     new Claim(ClaimTypes.GivenName, result.Name) 
    } 
    claims.AddRange(result.Groups.Select(g => new Claim(ClaimType.Role, g)); 

    // Create principal and attach to context 
    var principal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Sso"); 
    HttpContext.Current.User = principal; 
    Thread.CurrentPrincipal = principal; 
} 

private void Context_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
    var principal = ClaimsPrincipal.Current; 
    ClaimsAuthenticationManager transformer = FederatedAuthentication.SessionAuthenticationModule.FederationConfiguration.IdentityConfiguration.ClaimsAuthenticationManager; 
    transformer.Authenticate(string.Empty, principal); 
} 

public override ClaimsPrincipal Authenticate(string resourceName, ClaimsPrincipal incomingPrincipal) 
{ 
    if (!incomingPrincipal.Identity.IsAuthenticated) 
    { 
     return base.Authenticate(resourceName, incomingPrincipal); 
    } 

    ClaimsPrincipal newPrincipal = CreateApplicationPrincipal(incomingPrincipal); 

    EstablishSession(newPrincipal); 

    return newPrincipal; 
} 

private void EstablishSession(ClaimsPrincipal newPrincipal) 
{ 
    var sessionToken = new SessionSecurityToken(newPrincipal, TimeSpan.FromHours(8)); 
    FederatedAuthentication.SessionAuthenticationModule.WriteSessionTokenToCookie(sessionToken); 
} 

private ClaimsPrincipal CreateApplicationPrincipal(ClaimsPrincipal incomingPrincipal) 
{ 
    // Convert AD group to known role in our application. 
    string group = incomingPrincipal.FindFirst(ClaimTypes.Role).Value; 
    string role = new ADGroupToRoleConverter().ConvertADGroupToRole(group); 

    // Add claims for group. 
    // These would be loaded from a db. 
    List<Claim> claims = new ClaimDb().GetClaimsForRole(role); 

    // Just copy the claims for id and given name. 
    claims.Add(incomingPrincipal.FindFirst(ClaimTypes.NameIdentifier)); 
    claims.Add(incomingPrincipal.FindFirst(ClaimTypes.GivenName)); 

    return new ClaimsPrincipal(new ClaimsIdentity(claims, "MyApp")); 
} 

私が直面してる主な問題は、認証ステップが要求されるということですセッションが存在するにもかかわらず、すべての要求。セッションが存在していることを検出し、認証プロセス全体を処理する代わりにセッションを読み込むにはどうすればよいですか。

もう1つの問題は、認証ライブラリへの呼び出しに時間がかかることです。私は理想的にはそれもクレームの変圧器に移動する必要がありますね?

このコードをさらに改善するためのアイデアも、非常に高く評価されています。

私は、何かが明確でないか、もっと詳細な情報を提供する必要があるかどうか教えてください。

+1

あなたは申し立てをキャッシュする必要があるようです。これは、あなたの後ろのものに近いように見えます。 http://stackoverflow.com/questions/16904639/simple-claims-transformation-and-caching-w-windows-authentication –

答えて

0

認証後に各要求に認証情報を提供しないようです。認証が行われた後、各リクエストでセッションクッキーまたは認証ヘッダーが送信されたことを確認できますか?