Да, ты можешь. Части аутентификации и авторизации работают независимо. Если у вас есть собственная служба аутентификации, вы можете просто использовать авторизационную часть OWIN. Предположим, у вас уже есть UserManager
проверяющий username
и password
. Поэтому вы можете написать следующий код в своем действии обратной публикации:
[HttpPost]
public ActionResult Login(string username, string password)
{
if (new UserManager().IsValid(username, password))
{
var ident = new ClaimsIdentity(
new[] {
new Claim(ClaimTypes.NameIdentifier, username),
new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string"),
new Claim(ClaimTypes.Name,username),
new Claim(ClaimTypes.Role, "RoleName"),
new Claim(ClaimTypes.Role, "AnotherRole"),
},
DefaultAuthenticationTypes.ApplicationCookie);
HttpContext.GetOwinContext().Authentication.SignIn(
new AuthenticationProperties { IsPersistent = false }, ident);
return RedirectToAction("MyAction");
}
ModelState.AddModelError("", "invalid username or password");
return View();
}
И ваш менеджер пользователей может быть примерно таким:
class UserManager
{
public bool IsValid(string username, string password)
{
using(var db=new MyDbContext())
{
return db.Users.Any(u=>u.Username==username
&& u.Password==password);
}
}
}
В конце концов, вы можете защитить свои действия или контроллеры, добавив Authorize
атрибут.
[Authorize]
public ActionResult MySecretAction()
{
}
[Authorize(Roles="Admin")]
public ActionResult MySecretAction()
{
}
Login
коде требуется эта длинная константная строка ?... new Claim("http://schemas.microsoft.com/accesscontrolservice/2010/07/claims/identityprovider", "ASP.NET Identity", "http://www.w3.org/2001/XMLSchema#string")
Я проверил, что без него код работает нормально!