从JS客户端对SignalR控制台应用程序进行身份验证

时间:2015-11-16 20:36:15

标签: javascript c# asp.net angularjs signalr

以下方案/我的解决方案包含以下内容:

项目一:(SELF HOST)我有一个SignalR控制台应用程序,它处理逻辑,包括验证过程(用EF查询数据库)。
项目二:( CLIENT)我有ASP.Net web applicationAngularJS客户端。

到目前为止,我可以很好地与中心通信。问题是,我似乎无法使身份验证工作。我已经尝试过一些我发现的东西,但没有一个能够奏效。他们中的大多数甚至不适用于我的问题..

目前我已将我的项目剥离回基础知识,我有以下代码:

启动课程:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.UseCors(CorsOptions.AllowAll);
        app.MapSignalR();
    }
}

我的中心:

[HubName("systemHub")]
public class systemHub : Hub
{

    public void Authenticate(String pLogin, String pPassword)
    {
        User curUser = new AuthManager().Authenticate(pLogin, pPassword);
//this is where I'd want to send the auth cookie or whatever and contact the "loginCallback" function in my client
    }

    [Authorize]
    public void Hello(String pMessage)
    {
        Clients.All.callbackFunc(pMessage);
    }
}

Js客户:

    hinagApp.controller('hinagController', function ($scope) {
    $(document).ready(function () {
        var conURL = 'http://localhost:8080/signalr';
        $.getScript(conURL + '/hubs', function () {
            $.connection.hub.url = conURL;
            var lHub = $.connection.systemHub;

            lHub.client.callbackFunc = function(pM){
                alert(pM);
            }

            lHub.client.loginCallback = function (pSuccess) {
                if (pSuccess) {
                    //if logged in
                    lHub.server.hello("test");
                }
                else {
                    alert("fail");
                }
            }

            $('#loginbutton').click(function () {
                lHub.server.authenticate($('#input_login').val(), $('#input_pass').val());
            });

            $.connection.hub.start();
        });
    })
});

3 个答案:

答案 0 :(得分:1)

我最近遇到了类似的问题。如果我理解你,你想在你的signalr服务器应用程序上进行身份验证。 Signalr可以接受标准网络请求。

将身份验证类型设置为cookie:

        CookieAuthenticationOptions lOptions = new CookieAuthenticationOptions()
        {
            AuthenticationType = CookieAuthenticationDefaults.AuthenticationType,
            LoginPath = new PathString("/Auth/Login"),
            LogoutPath = new PathString("/Auth/Logout"),
        };

        app.UseCookieAuthentication(lOptions);

如果用户想要登录,请设置您要使用的声明

var lForm = await context.Request.ReadFormAsync();
                    if (!String.IsNullOrEmpty(lForm["input_login"]) && !String.IsNullOrEmpty(lForm["input_pass"]))
                    {
                        //Benutzer authentifizieren
                        var lAuthenticatedUser = new UserManager().Authenticate(lForm["input_login"], lForm["input_pass"]);
                        if (lAuthenticatedUser != null)
                        {
                            //Existiert der Nutzer legen wir die Claims an
                            ClaimsIdentity lIdentity = new ClaimsIdentity(lOptions.AuthenticationType);
                            lIdentity.AddClaim(new Claim(ClaimTypes.Name, lAuthenticatedUser.Username));
                            lIdentity.AddClaim(new Claim(ClaimTypes.NameIdentifier, lAuthenticatedUser.InternalUserId.ToString()));
                            lIdentity.AddClaim(new Claim(ClaimTypes.SerialNumber, context.Request.RemoteIpAddress));

                            //Und zum Schluss einloggen
                            context.Authentication.SignIn(lIdentity);

                            //Und auf die Spieleseite weiterleiten
                            context.Response.Redirect(BLL._Configuration.HinagGameURL);
                        }
                    }

如果您想要提供登录页面,您可以这样做(例如,_Authpage是您的页面为String)

                else if (context.Request.Path.Value == "/Auth/")
            {
                if (context.Authentication.User != null)
                    context.Response.Redirect(BLL._Configuration.HinagGameURL);


                context.Response.ContentType = "text/html";
                await context.Response.WriteAsync(_Authpage);
            }

如果用户需要其他任何内容(例如您的authpage中的其他样式文件)

                else
            {
                await next();
            }

所有这些都属于您的初创公司。

答案 1 :(得分:0)

select dbo.fn_FormatNameFromValues(FIRSTNAME, MIDDLENAME, LASTNAME) FROM PERSON中,您需要添加表单身份验证中间件(可能需要稍微调整一下):

Startup.cs

https://msdn.microsoft.com/en-us/library/microsoft.owin.security.cookies.cookieauthenticationoptions(v=vs.113).aspx

答案 2 :(得分:-1)

你用那段代码搞砸了Angular。试试这个:

hinagApp
    .controller('hinagController', function ($scope, $http) {
    var conURL = 'http://localhost:8080/signalr';
    var lHub = $.connection.systemHub;

    lHub.client.callbackFunc = function(pM){
        alert(pM);
    }

    lHub.client.loginCallback = function (pSuccess) {
        if (pSuccess) {
            //if logged in
            lHub.server.hello("test");
        }
        else {
            alert("fail");
        }
    }

    $http
        .get(conURL + '/hubs')
        .then(function(response) {
            $.connection.hub.url = conURL;
            $('#loginbutton').click(function () {
                lHub.server.authenticate($('#input_login').val(), $('#input_pass').val());
            });

            $.connection.hub.start();
        });
});