Asp.net MVC 5は、AuthorizeAttributeクラスを実装してカスタムの承認属性を作成し、そのメソッドをオーバーライドし、独自のロールでベイクしたい場合にSiteRoleプロパティを非表示にするAuthorizeAttributeクラスの使用を忘れたようです。私が見たすべての例は、OWINまたはIDフレームワークの使用を提案しています。これらは、新しいASP.Netフレームワークで認証と承認を行う唯一の2つの方法ですか?昔ながらの方法でそれをやると、何かを見逃すことはありますか?フレームワークにすべてのユーザーテーブルとロールテーブルを作成させたくありません。既存のユーザーとロールテーブルを新しいアプリケーションに追加する場合はどうなりますか?
また、まだすべてのアプリケーションでソーシャル統合の必要性を認識しておらず、すぐに必要になるとは思わない。カスタム認証属性を使用して最低限から始めてから、新しい認証機能を追加することを説明する記事はありますか。基本的に、認証なしまたは個別ユーザー認証が選択された、新しく作成されたプロジェクトのすべての混乱を説明するものが必要です。
ASP.NET Identityを使用して、MVC 5のAuthorizeAttributeを引き続きカスタマイズできます。 SimpleSecurity Project でこれを行う例があります。 コントローラーに使用できるカスタマイズされたAuthorizedAttribute および Web APIに使用できるカスタマイズされたAuthorizeAttribute 。これらのカスタムAuthorizeAttributesの背後にある概念は、 ここで説明するアプリケーションモデルからセキュリティモデルを分離する です。 Web APIの場合も 基本認証をサポート 。
セキュリティパイプラインはOWINの導入に伴い変更され、Web APIのAuthorizeAttributeの動作に関するいくつかの問題に遭遇しました。これは ここで説明 です。
SimpleMembershipという古いメンバーシッププロバイダーのMVC 5への移植に関するSimpleSecurityプロジェクトの例もあります。一部の アップグレードプロセスの問題についてはここで説明します 。ただし、古いメンバーシッププロバイダーの実装を使用できるように、機能するようにしました。ただし、ASP.NET Identityを使用することをお勧めします。これは、マイクロソフトが今後サポートする方法であり、より柔軟なアーキテクチャであり、多くの 古いメンバーシッププロバイダーで見つかった問題実装 。
Ben Fosterの2部構成のシリーズでは、ASP.NET Identityを使用したCookieベースの認証をゼロから実装する手順を紹介します。まず、認証が選択されていない新しいWebアプリから始めます。 「ASP.NET Identity Stripped Bare」 パート1 および パート2 に従ってください。
次のAuthorize属性を使用して、ユーザーが既に認証されている場合に不正アクセスを処理します。
public class LoggedOrAuthorizedAttribute : AuthorizeAttribute
{
public LoggedOrAuthorizedAttribute()
{
View = "error";
Master = String.Empty;
}
public String View { get; set; }
public String Master { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
CheckIfUserIsAuthenticated(filterContext);
}
private void CheckIfUserIsAuthenticated(AuthorizationContext filterContext)
{
// If Result is null, we’re OK: the user is authenticated and authorized.
if (filterContext.Result == null)
return;
// If here, you’re getting an HTTP 401 status code. In particular,
// filterContext.Result is of HttpUnauthorizedResult type. Check Ajax here.
if (filterContext.HttpContext.User.Identity.IsAuthenticated)
{
if (String.IsNullOrEmpty(View))
return;
var result = new ViewResult {ViewName = View, MasterName = Master};
filterContext.Result = result;
}
}
}