我似乎无法得到一个非常基本的cookie登录例如与MVC5和OWIN工作 [英] I can't seem to get a very basic cookie login example to work with MVC5 and OWIN
问题描述
我一直试图让我的脚湿与ASP.net MVC 5于2013年,但到目前为止,我一直未能得到连最基本的认证工作正常。
I've been trying to get my feet wet with ASP.net MVC 5 for 2013, but so far I've failed to get even the most basic authentication working correctly.
我一直在读周围的最后几天,我终于偶然发现(<一个href=\"http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/\" rel=\"nofollow\">http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/)这似乎给最基本的简单的例子,我能找到,所以我试过了,但它仍然不能似乎真正为用户创造一个会话。
I've been reading around for the last few days and I finally stumbled upon (http://brockallen.com/2013/10/24/a-primer-on-owin-cookie-authentication-middleware-for-the-asp-net-developer/) which seemed to give the most basic simple example I could find. So I tried that, but it still fails to seem to actually create a session for the user.
下面是我的cookie配置
Here is my cookie config
public void ConfigureAuth(IAppBuilder app)
{
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/FooBar")
});
}
下面是我的基本的自定义登录。
Here is my basic custom login.
public class LoginController : ApiController
{
private IAuthenticationManager Authentication
{
get { return Request.GetOwinContext().Authentication; }
}
// POST api/login
public void Post([FromBody]LoginInfo email)
{
var fooBar = Authentication.User;
var claims = new List<Claim>
{
new Claim(ClaimTypes.Name, "name")
,new Claim(ClaimTypes.Email, "email@email.com")
,new Claim(ClaimTypes.Role, "Foo")
};
var identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
Authentication.SignIn(new AuthenticationProperties() { IsPersistent = true }, identity);
}
}
如果我打的登录API两次,我本来期望的Foobar的变量设置为谁被标记为验证的用户,但是当我检查它,它只是说,它没有认证的第二次,并且没有关系'T有任何我本来期望的说法。
If I hit the the login api twice I would have expected the second time that the fooBar variable to be set to a user who is marked as authenticated, but when I check it, it just says it's not authenticated, and it doesn't have any of the claims I would have expected.
我也尝试创建一个基本的服务,只是检查,看看是否有人的情况下,通过身份验证我误解了它的工作,但是这也将失败。如果我尝试去给它,它说我没有通过身份验证,它不重定向我,因为我认为它会的。
I also tried creating a basic service to just check to see if it was authenticated in case I misunderstood how it worked, but this also fails. If I try to go to it, it says I'm not authenticated, it doesn't redirect me as I thought it would.
public class TestController : ApiController
{
[Authorize(Roles = "Foo")]
public int Get()
{
return 1;
}
}
我敢肯定,我一定只是缺少一些基本的,但到目前为止,不管我拨弄着,也不管我在网上看到了各种指南和建议,还没有能够连这个简单的场景的工作得到。在我做错了任何想法?
I'm sure I must just be missing some basic, but so far no matter what I fiddled with and regardless of the various guides and advice I've seen online, nothing has been able to get even this simple scenario working. Any ideas on what I'm doing wrong?
推荐答案
在下面的帖子的 http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown 有一个有用的OWIN例子。
In the following post http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown there is an helpful OWIN examples.
我做了一个错误,正确的链接: http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown-part-deux 所以,在这里我们去与基本的cookie登录VB的方法:
I did a mistake, the correct link is: http://www.khalidabuhakmeh.com/asp-net-mvc-5-authentication-breakdown-part-deux So, here we go with vb approach for basic cookie login:
A)的Cookie配置。
a) Cookie Config.
Imports Microsoft.AspNet.Identity
Imports Microsoft.Owin
Imports Microsoft.Owin.Security.Cookies
Imports Owin
Partial Public Class Startup
Public Sub ConfigureAuth(app As IAppBuilder)
app.UseCookieAuthentication(New CookieAuthenticationOptions() With {
.AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
.LoginPath = New PathString("/Account/Login")})
End Sub
End Class
二)家庭控制器(可auth用户)首页指数
b) Home controller (Home index available for auth users)
<Authorize>
Public Class HomeController
Inherits System.Web.Mvc.Controller
<HttpGet>
Function Index() As ActionResult
Return View()
End Function
End Class
C)帐户控制器(登录)
c) Account controller (Login)
Imports System.Security.Claims
Imports System.Threading.Tasks
Imports Microsoft.AspNet.Identity
Imports Microsoft.AspNet.Identity.Owin
Imports Microsoft.Owin.Security
<Authorize>
Public Class AccountController
Inherits Controller
Private Function AuthenticationManager() As IAuthenticationManager
Return HttpContext.GetOwinContext().Authentication
End Function
<AllowAnonymous>
Public Function Login(returnUrl As String) As ActionResult
ViewBag.ReturnUrl = returnUrl
Return View()
End Function
<HttpPost>
<AllowAnonymous>
<ValidateAntiForgeryToken>
Public Function Login(model As LoginViewModel, returnUrl As String) As ActionResult
If ModelState.IsValid Then
If model.UsuarioValido Then 'Local authentication, this must be on Repository class
Dim Identidad = New ClaimsIdentity({New Claim(ClaimTypes.Name, model.UserName)},
DefaultAuthenticationTypes.ApplicationCookie,
ClaimTypes.Name,
ClaimTypes.Role)
Identidad.AddClaim(New Claim(ClaimTypes.Role, "Invitado"))
AuthenticationManager.SignIn(New AuthenticationProperties() With {.IsPersistent = model.RememberMe}, Identidad)
Return RedirectToAction("index", "home")
End If
End If
Return RedirectToAction("login", model)
End Function
<HttpGet>
Public Function LogOff() As ActionResult
AuthenticationManager.SignOut()
Return RedirectToAction("login")
End Function
End Class
D)账户型号
Imports System.ComponentModel.DataAnnotations
Public Class LoginViewModel
<Required>
<Display(Name:="Nombre de usuario")>
Public Property UserName As String
<Required>
<DataType(DataType.Password)>
<Display(Name:="Contraseña")>
Public Property Password As String
<Display(Name:="¿Recordar cuenta?")>
Public Property RememberMe As Boolean
Public ReadOnly Property UsuarioValido As Boolean
Get
Return Password = "secreto" 'Password Here!
End Get
End Property
End Class
E)索引视图
@Imports Microsoft.AspNet.Identity
@Code
ViewData("Title") = "Página Inicial"
End Code
<h2>Bienvenido @User.Identity.GetUserName()</h2>
<a href="@Url.Action("LogOff", "Account")">
Click para salir! (Cerrar Sesión)
</a>
F)登录查看
@ModelType LoginViewModel
@Code
ViewBag.Title = "Iniciar sesión"
End Code
<h2>@ViewBag.Title.</h2>
<div class="row">
<div class="col-md-8">
<section id="loginForm">
@Using Html.BeginForm("Login", "Account", New With { .ReturnUrl = ViewBag.ReturnUrl }, FormMethod.Post, New With {.class = "form-horizontal", .role = "form"})
@Html.AntiForgeryToken()
@<text>
<h4>Utilice una cuenta local para iniciar sesión.</h4>
<hr />
@Html.ValidationSummary(True)
<div class="form-group">
@Html.LabelFor(Function(m) m.UserName, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.TextBoxFor(Function(m) m.UserName, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.UserName)
</div>
</div>
<div class="form-group">
@Html.LabelFor(Function(m) m.Password, New With {.class = "col-md-2 control-label"})
<div class="col-md-10">
@Html.PasswordFor(Function(m) m.Password, New With {.class = "form-control"})
@Html.ValidationMessageFor(Function(m) m.Password)
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<div class="checkbox">
@Html.CheckBoxFor(Function(m) m.RememberMe)
@Html.LabelFor(Function(m) m.RememberMe)
</div>
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Iniciar sesión" class="btn btn-default" />
</div>
</div>
</text>
End Using
</section>
</div>
</div>
@Section Scripts
@Scripts.Render("~/bundles/jqueryval")
End Section
这篇关于我似乎无法得到一个非常基本的cookie登录例如与MVC5和OWIN工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!