Güncelleme: yardımına sayesinde burada aşağıdaki çözümü oluşturduk: Ben NerdDinner başladı ve benim üyelik sağlayıcısı olarak ActiveDirectory ile FormsAuthentication kullanıyorumözniteliği, erişim engellendi yerine kullanıcı oturum açmasını ister?
public class CustomAuthorize : AuthorizeAttribute
{
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
{
// Returns HTTP 401 - see comment in HttpUnauthorizedResult.cs
// If user is not logged in prompt
if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
{
base.HandleUnauthorizedRequest(filterContext);
}
// Otherwise deny access
else
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary {
{"controller", "Account"},
{"action", "NotAuthorized"}
});
}
}
}
. Global.asax & AccountController (aşağıda) ile db aracılığıyla roller için destek ekledim.
Şimdi denetleyicimde Yetkilendirmem özniteliğimi yalnızca yönetici rollerine (aşağıda) ayarladım. Giriş yapmış kullanıcım bir yazar. Silmeyi tıkladığımda, daha önce yapmış olduğum halde giriş yapmamı ister. Erişimi reddedilmiş bir görünüme döndürmek için mantığı nereye yerleştirebilirim?
Global.asax.cs
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
HttpCookie authCookie = Context.Request.Cookies[FormsAuthentication.FormsCookieName];
if (authCookie == null || authCookie.Value == "")
{
return;
}
FormsAuthenticationTicket authTicket = null;
try
{
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
}
catch
{
return;
}
if (Context.User != null)
{
string[] roles = authTicket.UserData.Split(new char[] { ';' });
Context.User = new GenericPrincipal(Context.User.Identity, roles);
}
}
AccountController.cs
[HttpPost]
[System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1054:UriParametersShouldNotBeStrings",
Justification = "Needs to take same parameter type as Controller.Redirect()")]
public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
{
if (!ValidateLogOn(userName, password))
{
ViewData["rememberMe"] = rememberMe;
return View();
}
// Make sure we have the username with the right capitalization
// since we do case sensitive checks for OpenID Claimed Identifiers later.
userName = this.MembershipService.GetCanonicalUsername(userName);
// Lookup user's (CWID) appropriate access level
string accessLevel = userRepository.FindUserByUserName(userName).AccessLevel.LevelName;
FormsAuthenticationTicket authTicket = new
FormsAuthenticationTicket(1, //version
userName, // user name
DateTime.Now, //creation
DateTime.Now.AddMinutes(30), //Expiration
rememberMe, //Persistent
accessLevel); // hacked to use roles instead
string encTicket = FormsAuthentication.Encrypt(authTicket);
this.Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encTicket));
if (!String.IsNullOrEmpty(returnUrl))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
SpotlightController.cs Sana AuthorizeAttribute türetme ve ardından HandleUnauthorizedRequest geçersiz kılmak ve koyabiliriz
[Authorize(Roles="Admin")]
public ActionResult Delete(int id)
Craig kesinlikle haklı - bir roller istisnası kimliği doğrulanmamış bir kullanıcı ile ele almak zorunda kalacaktı. Bunun çok zor olacağını düşünmüyorum, ama denemedim ki YMMV. Kendi kimlik doğrulama planınızı gerçekten uygulamak istemediğiniz sürece, AuthorizeCode veya OnAuthorization ile uğraşmanızı öneriyorum. – Hal
Daha fazla okumam gerek. Bu arada, HandleUnauthorizedRequest'i geçersiz kılarak bazı yardımları kullanabilirim. AuthorizeAttribute öğesinden devraldığım ve sonra da HandleUnauthorizedRequest'i geçersiz kılan kendi sınıfımı nasıl açacağımı anlıyorum. Kendi özelliklerine ihtiyacım yok çünkü değişmekte olduğum tek şey bu. Peki, türetmeden HandleUnauthorizedRequest nasıl geçersiz kılınacak? – ryan
Yeni bir tür türetmeli ve bu yöntemi geçersiz kılmalısınız. Ama bu yöntem değişmeniz gereken tek şey. –