小编Lom*_*ani的帖子

WS-Federation登录Asp.NET 5 MVC 6 ADFS

您好,我一直在尝试在我的MVC6 Web应用程序上实现WS-Fed SSO,我已经阅读了一些关于身份验证的内容以及所有来确定我的要求.我必须使用WsFederationAuth,所以没有oauth或saml协议对我有用.

编辑:在@Pinpoint建议之后我尝试使用owin中间件来实现连接,但是我将使用完整的框架DNX451而不是DNXCore,但它等待Vnext支持ws-fed.

精确定位 适配器扩展:

 public static class AppBuilderExtensions
    {
#if !DNXCORE50
        public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app,
            Action<IAppBuilder> configuration)
        {
            if (app == null)
            {
                throw new ArgumentNullException(nameof(app));
            }

            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }


            return app.UseOwin(setup => setup(next =>
            {
                var builder = new AppBuilder();
                var lifetime = (IApplicationLifetime) app.ApplicationServices.GetService(typeof (IApplicationLifetime));

                var properties = new AppProperties(builder.Properties);
                properties.AppName = app.ApplicationServices.GetApplicationUniqueIdentifier();
                properties.OnAppDisposing = lifetime.ApplicationStopping;
                properties.DefaultApp = next;

                configuration(builder);

                return builder.Build<Func<IDictionary<string, object>, Task>>(); …
Run Code Online (Sandbox Code Playgroud)

asp.net adfs ws-federation asp.net-core-mvc asp.net-core

10
推荐指数
1
解决办法
8481
查看次数

即使有DoNotCallBase,Nsubstitute调用方法

我部分嘲笑有这两种方法的类:

public void EmitTo(string connectionId, ChatMessage message)
{
    Clients.Client(connectionId).broadcastMessage(message.User.UserName, message.Message);
}

public virtual void Broadcast(ChatMessage message)
{
    Clients.All.broadcastMessage(message.User.UserName, message.Message);
}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,[SetUp]我有这些电话:

hub = Substitute.ForPartsOf<ChatHub>(myMockedClient, context, groupManager);
hub.When(x => x.Broadcast(Arg.Any<ChatMessage>())).DoNotCallBase();
hub.When(x => x.EmitTo(Arg.Any<string>(), Arg.Any<ChatMessage>())).DoNotCallBase();
Run Code Online (Sandbox Code Playgroud)

Broadcast在调用该方法时调用此行或稍后调用没有问题(它们没有按预期执行任何操作)但奇怪的是我的第三行抛出错误:

System.ArgumentException:参数不能为null或为空参数名称:connectionId

我有点迷失,因为我对两种方法做了完全相同的事情并获得了不同的行为,为什么我的when方法调用EmitTo

c# nunit unit-testing mocking nsubstitute

6
推荐指数
1
解决办法
2978
查看次数

os.FindProcess(pid)之后的os.Process.Wait()适用于不在linux上的Windows

尝试恢复进程时遇到问题.我去应用发射一束的过程,当它崩溃的过程是那里在开放,当我重新运行我的应用我想我的恢复过程.在Windows上,一切都按预期工作,我可以wait()在进程kill()上等...但在linux中它只是通过我wait()没有任何错误.这是代码

func (proc *process) Recover() {

    pr, err := os.FindProcess(proc.Cmd.Process.Pid)

    if err != nil {
        return
    }

    log.Info("Recovering " + proc.Name + proc.Service.Version)

    Processes.Lock()
    Processes.Map[proc.Name] = proc
    Processes.Unlock()
    proc.Cmd.Process = pr

    if proc.Service.Reload > 0 {
        proc.End = make(chan bool)
        go proc.KillRoutine()
    }

    proc.Cmd.Wait()

    if proc.Status != "killed" {
        proc.Status = "finished"
    }
    proc.Time = time.Now()


    channelProcess <- proc

    //confirmation that process was killed
    if proc.End != nil {
        proc.End <- true
    }

} …
Run Code Online (Sandbox Code Playgroud)

linux windows go

6
推荐指数
1
解决办法
551
查看次数

执行实体框架时,CONTEXT_INFO丢失.SaveChanges(重载)

解:

你可以找到:这里

  • 如果在操作之前尚未打开连接,则对象上下文将打开该连接.如果对象上下文在操作期间打开连接,则它将始终在操作完成时关闭连接.
  • 如果手动打开连接,则对象上下文不会关闭它.调用Close或Dispose将关闭连接.

问题是EF会打开和关闭SetUserContext的连接,所以我会松开CONTEXT_INFO.为了保持它,我需要手动打开连接并在SaveChanges之后关闭它

public int SaveChanges(string modifierId)
{
        Database.Connection.Open();
        SetUserContext(modifierId);
        var changes = base.SaveChanges();
        Database.Connection.Close();
        return changes;            
 }
Run Code Online (Sandbox Code Playgroud)

题 :

该系统适用于数据仓库.数据库必须知道谁修改它并保存Audit表中的任何更改.

为了达到这个结果,我主要依靠触发器和程序:

此函数将userId保存在CONTEXT_INFO中:

CREATE PROCEDURE [dbo].[SetUserContext]
    @userId NVARCHAR (64)
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @context VARBINARY(128)
    SET @context = CONVERT(VARBINARY(128), @userId)

    SET CONTEXT_INFO @context
END
Run Code Online (Sandbox Code Playgroud)

这个可以在任何地方使用来获取userId:

CREATE FUNCTION [dbo].[GetUserContext] ()
RETURNS NVARCHAR (64)
AS
BEGIN
    RETURN CONVERT(NVARCHAR (64), CONTEXT_INFO())
END
Run Code Online (Sandbox Code Playgroud)

例如,在我的触发器中,我有:

CREATE TRIGGER UpdateUser 
ON [dbo].[Users] 
FOR UPDATE
  AS
    BEGIN
      INSERT INTO [Audit_Users]
      SELECT …
Run Code Online (Sandbox Code Playgroud)

.net c# sql wcf entity-framework

5
推荐指数
1
解决办法
3051
查看次数